Page MenuHomePhabricator (Chris)

No OneTemporary

Size
194 KB
Referenced Files
None
Subscribers
None
diff --git a/data/labels.txt b/data/labels.txt
index 4402354..d413f48 100644
--- a/data/labels.txt
+++ b/data/labels.txt
@@ -1,1787 +1,1791 @@
[english]
start_new_game#Start a new game
start_desc#Old game will be destroyed
restore#Restore game
at#at
level#level
begin_journey#Begin your journey in a new dungeon
config_keys#Configure keys
redef_input#Redefine player's input
exit_game#Exit game
return_to_desktop#Return to the desktop
key_configuration#Keys' configuration
key_configuration_desc#Please configure the keys
key_configuration_insert#[insert Key]
key_configuration_done#DONE
key_move_up#move up
key_move_down#move down
key_move_left#move left
key_move_right#move right
key_fire_up#fire up
key_fire_down#fire down
key_fire_left#fire left
key_fire_right#fire right
key_fire_select#fire select
key_time#time control
key_fire#fire (one button)
key_spell#cast a spell
configure_game#Configuration
configure_game_desc#Changes game options
config_back#Back
config_back_desc#Back to the main menu
config_lang#Language
config_lang_desc#Choose with left and right arrows
english#English
french#French
keys_move#move
keys_fire#fire
keys_select_1#fire
keys_select_2#selector
keys_time#time control
tuto_reset#Tutorial reset
tuto_reset_desc#Resets the tutorial
menu_continue#Continue
menu_continue_desc#Continue the game
menu_save_quit#Save and quit
menu_save_quit_desc#Save and return to main screen
menu_quit#Quit without saving
menu_quit_desc#Return to main screen without saving
play_again#Press [ENTER] to play again / [ESC] to go back to the menu
items_found#Items
monsters_killed#Monsters
congratulations_1#CONGRATULATIONS!
congratulations_2#You've challenged this demo and kill the bosses!
congratulations_3#See you soon for new adventures!
by#by
critical#CRITICAL X2
poison#POISON
merchant_speech_0#Best price in the entire dungeon!
merchant_speech_1#Welcome to the Pawn'n'Witches shop!
merchant_speech_2#Have a look at our merchandise!
enemy_butcher#Pigman Butcher
enemy_giant_slime#Giant Slime
enemy_rat_king#Wererat King
enemy_giant_spider#Giant Spider
item_copper#Copper coin
item_copper_desc#A copper coin (value 1)
item_silver#Silver coin
item_silver_desc#A silver coin (value 5)
item_gold#Gold coin
item_gold_desc#A gold coin (value 10)
item_titan_heart#Titan's Heart
item_titan_heart_desc#Increases Max HP
item_elven_cookie#Elven Cookie
item_elven_cookie_desc#Restores and increases Max HP
item_apple#Apple
item_apple_desc#Restores 3 HP
item_apple_green#Green apple
item_apple_green_desc#Restores 3 HP and cures poison
item_bread#Bread
item_bread_desc#Restores 7 HP
item_cheese#Cheese
item_cheese_desc#Restores 15 HP
item_boss_key#Boss Key
item_boss_key_desc#Opens the Boss gate
item_sorcerer_hat#Sorcerer's Hat
item_sorcerer_hat_desc#Increases fire rate
item_velvet_boots#Velvet Boots
item_velvet_boots_desc#Increases speed
item_spell_dual#Spell : Dual bolts
item_spell_dual_desc#Shoots two bolts
item_rage_amulet#Rage Amulet
item_rage_amulet_desc#Retaliates
item_displacement_gloves#Displacement Gloves
item_displacement_gloves_desc#Player's velocity impacts bolt's one
item_staff_desc#Increases bolt's speed and damage
item_fairy#Fairy Lilly
item_fairy_desc#Helps you in the dungeon
item_leather_belt#Leather belt
item_leather_belt_desc#Increases fire rate
item_blood_snake#Blood Snake
item_blood_snake_desc#Increases damage
item_gem_ice#Ice Gem
item_gem_ice_desc#Ice attack (freeze)
item_gem_illusion#illusion Gem
item_gem_illusion_desc#illusion attack (ignores walls and armor)
item_gem_stone#Stone Gem
item_gem_stone_desc#Stone attack (repulse)
item_gem_lightning#Lightning Gem
item_gem_lightning_desc#Lightning attack (bouncing)
item_fairy_ice#Fairy Natasha
item_fairy_ice_desc#Helps you in the dungeon
item_ring_ice#Sapphire Ring
item_ring_ice_desc#Increases ice power
item_ring_stone_desc#Increases stone power
item_ring_lightning_desc#Increases lightning power
item_ring_illusion_desc#Increases illusion power
item_spell_triple#Spell : Triple bolts
item_spell_triple_desc#Shoots three bolts
item_fairy_fire#Fairy Alicia
item_fairy_fire_desc#Helps you in the dungeon
item_fairy_target#Fairy Scarlett
item_fairy_target_desc#Helps you in the dungeon
item_robe_magician#Magician's Robe
item_robe_magician_desc#Increases armor
item_gem_fire#Fire Gem
item_gem_fire_desc#Fire attack (more damages)
item_ring_fire#Ruby Ring
item_ring_fire_desc#Increases fire power
item_manual_staff#Staff's Manual
item_manual_staff_desc#Increases fire range
item_spell_teleport#Spell: Teleport
item_spell_teleport_desc#Cast to teleport within the room
item_spell_slime_explode#Spell: Invoke Slime
item_spell_slime_explode_desc#Cast to invoke an explosive slime
item_spell_fireball#Spell: Fireball
item_spell_fireball_desc#Cast to launch a fireball
item_spell_freeze#Spell: Freeze monsters
item_spell_freeze_desc#Cast to freeze monsters
item_spell_earthquake#Spell: Earthquake
item_spell_earthquake_desc#Cast to make the dungeon shake
item_spell_protection#Spell: Magic shield
item_spell_protection_desc#Cast to summon a magic shield
item_manual_slime#Manual of Slime Mastery
item_manual_slime_desc#Slimes don't aim at you anymore
item_spell_dual_quick#Spellbook of Quick Dual bolts
item_spell_dual_quick_desc#Shoots two bolts (quick)
item_spell_triple_quick#Spellbook of Quick Triple bolts
item_spell_triple_quick_desc#Shoots three bolts (quick)
item_manual_health#Health's Manual
item_manual_health_desc#Health items give more HP
item_rear_shot#Staff cap
item_rear_shot_desc#Shots a rear bolt
item_book_random_shot#Spellbook of Random Shot
item_book_random_shot_desc#Shots a bolt in a random direction
item_spell_web#Spell: Spider Web
item_spell_web_desc#Cast to throw spider webs
item_book_magic_i#Book of magic - Tome I
item_book_magic_i_desc#Decreases spell's cooldown
item_book_magic_ii#Book of magic - Tome II
item_book_magic_ii_desc#Increases spell's power
item_sulfur#Sulfur
item_sulfur_desc#Can make corpses explode
spell_teleport#teleport
spell_slime_explode#invoke slime
spell_fireball#fireball
spell_freeze#freeze monsters
spell_earthquake#earthquake
spell_protection#magic shield
spell_web#spider web
msg_level1_0#Your quest begins!
msg_level1_1#"Witches have abducted the Archmage's daughter and brought her in their lair.
msg_level1_2#I have to recover her!"
msg_level2_0#The Archmage's daughter
msg_level2_1#"I'm coming right now to rescue you!
msg_level2_2#Hopefully, she's safe and sound..."
msg_level3_0#The Archmage's daughter
msg_level3_1#"Did I ever tell you?
msg_level3_2#The Archmage's daughter is the sweetest girl of the Magic Academy!"
msg_level4_0#The Archmage
msg_level4_1#"The Archmage is a very wise man, and also my mentor.
msg_level4_2#He's taught me we live in the best of the worlds."
msg_level5_0#The Archmage's daughter
msg_level5_1#"I remember the Archmage's daughter and me, back in the Magic Academy.
msg_level5_2#We used to play at the healer mage, hi hi!"
msg_level6_0#The Archmage
msg_level6_1#"My parents died when I was a baby.
msg_level6_2#The Archmage has raised me like his own son."
msg_rats_bats_0#Monsters
msg_rats_bats_1#"Hey! Why do we always have to exterminate rats or bats
msg_rats_bats_2#in these Rogue games ?"
msg_snakes_0#Snakes
msg_snakes_1#"I HATE snakes!"
msg_witches_0#Witches
msg_witches_1#"B... Witches!!!"
msg_gold_0#Gold
msg_gold_1#"♫ Money money money ♫
msg_gold_2#I wonder if I can buy useful items in this dungeon..."
msg_familiar_0#Fairies
msg_familiar_1#"Oh! I've got company!
msg_familiar_2#I hope I'll find others allies in the dungeon."
msg_butcher_0#The Pigman Butcher
msg_butcher_1#"Wow this one is a big guy!
msg_butcher_2#I hope I won't end up in sausages..."
msg_giant_slime_0#The Giant Slime
msg_giant_slime_1#"I am green, huge and I stink.
msg_giant_slime_2#What I am ?"
msg_cyclops_1#"How did it go in the room?
msg_cyclops_2#It's bigger and larger than the gate!"
msg_wererat_0#The Wererat
msg_wererat_1#"Looks like my old aunt..."
msg_giant_spider_before_0#The empty room
msg_giant_spider_before_1#"Is there anybody in there? "
msg_giant_spider_after_0#The Giant Spider
msg_giant_spider_after_1#"I HATE spiders"
msg_tuto_intro_0#Tutorial: Basics
msg_tuto_intro_1#Use WASD (standard) to move around the dungeon.
msg_tuto_intro_2#Fire with the arrows (standard).
msg_tuto_items_0#Tutorial: Items
msg_tuto_items_1#Items enhance your character or give you new powers.
msg_tuto_items_2#Find or buy as many as you can.
msg_tuto_heal_0#Tutorial: Health
msg_tuto_heal_1#You've lost some hit points.
msg_tuto_heal_2#Find something to heal you before you die.
msg_tuto_shops_0#Tutorial: Shops
msg_tuto_shops_1#You can find many shops in the dungeon.
msg_tuto_shops_2#Here can you spend money to buy items or food.
msg_tuto_boss_door_0#Tutorial: Boss gate
msg_tuto_boss_door_1#From here, you can see a closed golden door.
msg_tuto_boss_door_2#Here is the boss of the floor, but you need the golden key to enter.
msg_tuto_challenge_door_0#Tutorial: Challenge room
msg_tuto_challenge_door_1#Look at the decorative door. It is a challenge room.
msg_tuto_challenge_door_2#You can obtain valuable rewards here, but enter with caution!
msg_tuto_shots_0#Tutorial: Shot types
msg_tuto_shots_1#You've found a new shot type.
msg_tuto_shots_2#Press [fire select] (standard: tab) to switch between your shot types.
msg_tuto_spell_0#Tutorial: Spells
msg_tuto_spell_1#You've found a magic spell.
msg_tuto_spell_2#Press the spell key (standard: space) to cast the spell.
msg_francky_0#The... Thing
msg_francky_1#Yuk... It looks like made with various body parts!
msg_tuto_tips_0#Tutorial: Tips
msg_tuto_tips_1#Use Time Control (standard: RShift) to travel faster.
msg_tuto_tips_2#Press [Enter] to close the message box immediately.
enemy_type_bat#a bat
enemy_type_rat#a rat
enemy_type_rat_black#a black rat
enemy_type_rat_helmet#a rat with helmet
enemy_type_rat_black_helmet#a black rat with helmet
enemy_type_evil_flower#an evil flower
enemy_type_evil_flower_ice#an evil edelweiss
enemy_type_snake#a snake
enemy_type_snake_blood#a blood snake
enemy_type_slime#a slime
enemy_type_slime_red#a red slime
enemy_type_slime_blue#a blue slime
enemy_type_slime_violet#a violet slime
enemy_type_imp_blue#a blue imp
enemy_type_imp_red#a red imp
enemy_type_pumpkin#a mad pumpkin
enemy_type_witch#a witch
enemy_type_witch_red#a red witch
enemy_type_cauldron#a cauldron
enemy_type_bubble#a bubble
enemy_type_boss_butcher#the Pigman Butcher
enemy_type_boss_slime_giant#the Giant Slime
enemy_type_boss_rat_king#the Wererat King
enemy_type_boss_spider_giant#the Giant Spider
enemy_type_green_rat#a green rat
enemy_type_rock_falling#a falling rock
enemy_type_rock_missile#a throwing rock
enemy_type_spider_egg#a falling spider egg
enemy_type_spider_little#a spider
enemy_type_spider_web#a spider web
enemy_type_ghost#a ghost
enemy_type_zombie#a zombie
enemy_type_zombie_dark#a dark zombie
enemy_type_francky#the Thing
enemy_type_himself#himself
source_explosion#explosion
source_poison#poison
enemy_francky#The Thing
enemy_francky_head#The Thing's head
inventory#Inventory
dc_certificate#Death certificate
dc_killed_by#Killed by
dc_died_level#Died on level
dc_after#after
dc_minutes#min. of game
dc_killed_monsters#Slayed monsters
dc_gold#Gold
dc_challenges#Completed challenges
player_name#Player name
player_name_desc#Modify player name
hi_scores#Hall of fame
hi_scores_desc#Best scores
credits#Credits
credits_desc#Credits screen
volume_sound#Sound volume
volume_sound_desc#Use left/right arrows to change volume
volume_music#Music volume
certificate_capture#Press [F1] to save the certificate as a PNG file
certificate_saved#Saved to
msg_tuto_temple_0#Tutorial: Temple
msg_tuto_temple_1#The temple is the place where you can worship a divinity or donate.
msg_tuto_temple_2#Divinities can help you and provide bonuses.
key_interact#interact
interact_worship#Worship
interact_shop#Buy
interact_donate#Donate 10 pieces of gold
interact_donate_fail#(not enough gold)
worshipping#You're now a worshipper of
divinity_healer_0#Pomonos the Righteous
divinity_healer_1#Guardian of the righteousness and patroness of the weak.
divinity_healer_2#He appreciates donations, suffering and fighting evil.
divinity_fighter_0#Tello the Powerful
divinity_fighter_1#Lord of the fighters and the war.
divinity_fighter_2#He appreciates monsters and titans falling in battle.
divinity_ice_0#Mister Snow
divinity_ice_1#Divinity of the cold.
divinity_ice_2#He likes the use of ice.
divinity_stone_0#Gaya
divinity_stone_1#Divinity of the stone and earth.
divinity_stone_2#He likes the use of stone.
divinity_intervention_0#Divine intervention
divinity_intervention_1#intervenes in your favour.
divinity_gift_0#Divine gift
divinity_gift_1#grants you a gift.
item_floor_map#Dungeon Map
item_floor_map_desc#Reveals the map of the present floor
item_alcohol#Absinthe
item_alcohol_desc#Temporarily increases damage
item_staff#Ebony Staff
item_ring_stone#Quartz Ring
item_ring_lightning#Amethyst Ring
item_ring_illusion#Obsidian Ring
enemy_cyclops#Stone Cyclops
msg_cyclops_0#The Stone Cyclops
enemy_type_boss_cyclops#the Stone Cyclops
achiev_rats#Rodenticide
achiev_rats_desc#Kill one rat
achiev_100#Stingy
achiev_100_desc#Collect 100 gold coins
achiev_piety_max#Faithful
achiev_piety_max_desc#Reach the max piety level
achiev_3_hits#Brochette
achiev_3_hits_desc#Hurt 3 monsters with the same shot
achiev_complete_set#Dressed
achiev_complete_set_desc#Equip robe + hat + boots + gloves
achiev_giant_slime#Giant Slime Slayer
achiev_giant_slime_desc#Kill the Giant Slime
achiev_cyclops#Cyclops Slayer
achiev_cyclops_desc#Kill the Stone Cyclops
achiev_rat_king#Wererat Slayer
achiev_rat_king_desc#Kill the Wererat king
achiev_giant_spider#Giant Spider Slayer
achiev_giant_spider_desc#Kill the Giant Spider
achiev_francky#Thing Slayer
achiev_francky_desc#Kill the Thing
enemy_type_evil_flower_fire#an evil fire flower
menu_achievements#Achievements
menu_achievements_desc#Display the achievements
item_spell_flower#Spell: Invoke magic flower
item_spell_flower_desc#Cast to invoke a magic flower
item_rapid_shots#Spellbook of Rapid Fire
item_rapid_shots_desc#Wizard machine gun
item_fairy_poison#Fairy Vicky
item_fairy_poison_desc#Helps you in the dungeon
item_luck#Four-leaf clover
item_luck_desc#Temporarily increases gold drop
item_fairy_powder#Fairy Dust
item_fairy_powder_desc#Temporarily excites the fairies
item_ring_poison#Emerald ring
item_ring_poison_desc#Increases poison power
item_gem_poison#Poison Gem
item_gem_poison_desc#Poison attack
item_book_prayer_i#Book of prayer - Tome I
item_book_prayer_i_desc#Increases piety
item_book_prayer_ii#Book of prayer - Tome II
item_book_prayer_ii_desc#Reduces reconversion cost
item_pet_slime#Slime Pet
item_pet_slime_desc#It will follow and help you
item_hat_advanced#Warlock's Hat
item_hat_advanced_desc#Increases fire rate
item_robe_advanced#Magic robe of shock
item_robe_advanced_desc#Repulses and increases armor
item_critical#Fake mage beard
item_critical_desc#Chance to critical shot (x2)
item_critical_advanced#Fake Archmage beard
item_critical_advanced_desc#Increases critical damage (x3)
item_spell_fairy#Spell: Fairy transmutation
item_spell_fairy_desc#Cast to transmute to a fairy
+item_gloves_advanced#Ranger gloves
+item_gloves_advanced_desc#Disarm traps and firerate+
+item_boots_advanced#Ranger boots
+item_boots_advanced_desc#Increases speed
[french]
start_new_game#Nouvelle partie
start_desc#L'ancienne partie sera perdue
restore#Continuer la partie
at#à
level#niveau
begin_journey#Démarrer dans un nouveau donjon
config_keys#Configurer le clavier
redef_input#Redéfinir les touches
exit_game#Quitter
return_to_desktop#Retour au bureau
key_configuration#Configuration des touches
key_configuration_desc#Veuillez configurer les touches
key_configuration_insert#[presser touche]
key_configuration_done#FAIT
key_move_up#Déplacement haut
key_move_down#Déplacement bas
key_move_left#Déplacement gauche
key_move_right#Déplacement droite
key_fire_up#Tir haut
key_fire_down#Tir bas
key_fire_left#Tir gauche
key_fire_right#Tir droite
key_fire_select#Sélecteur de tir
key_time#Accélérer le temps
key_fire#Tir (un bouton)
key_spell#Lancer un sort
configure_game#Configuration
configure_game_desc#Modifier les options
config_back#Retour
config_back_desc#Retour au menu principal
config_lang#Langue
config_lang_desc#Choisissez avec les flèches (gauche et droite)
english#Anglais
french#Français
keys_move#déplacer
keys_fire#tirer
keys_select_1#sélecteur
keys_select_2#de tir
keys_time#accélerer
tuto_reset#RAZ des tutoriels
tuto_reset_desc#Réinitialisation des tutoriels
menu_continue#Continuer
menu_continue_desc#Continuer le jeu
menu_save_quit#Sauvegarder et quitter
menu_save_quit_desc#Sauvegarder et retourner au menu principal
menu_quit#Quitter sans sauvegarder
menu_quit_desc#Retourner au menu principal sans sauvegarder
inventory#Equipement
play_again#Pressez [ENTRER] pour rejouer / [ESC] pour revenir au menu
items_found#Objets
monsters_killed#Monstres
congratulations_1#FELICITATIONS !
congratulations_2#Vous êtes brillamment arrivé au terme de cette démo !
congratulations_3#A bientôt pour de nouvelles aventures !
by#par
critical#CRITIQUE X2
poison#POISON
merchant_speech_0#Les meilleures affaires du donjon !
merchant_speech_1#Bienvenue à la boutique Pawn'n'Witches !
merchant_speech_2#Jetez un oeil à nos produits !
enemy_butcher#Boucher porcin
enemy_giant_slime#Slime géant
enemy_cyclops#Cyclope de pierre
enemy_rat_king#Roi des Rats-garous
enemy_giant_spider#Araignée géante
enemy_francky#La Chose
enemy_francky_head#La tête de la Chose
item_copper#Pièce de cuivre
item_copper_desc#Une pièce de cuivre (1)
item_silver#Pièce d'argent
item_silver_desc#Une pièce d'argent (5)
item_gold#Pièce d'or
item_gold_desc#Une pièce d'or (10)
item_titan_heart#Coeur de Titan
item_titan_heart_desc#Augmente les PV max
item_elven_cookie#Biscuit elfique
item_elven_cookie_desc#Guérit et augmente les PV
item_apple#Pomme
item_apple_desc#Guérit 3 PV
item_apple_green#Pomme verte
item_apple_green_desc#Guérit le poison et 3 PV
item_bread#Pain
item_bread_desc#Guérit 7 HP
item_cheese#Fromage
item_cheese_desc#Guérit 15 HP
item_boss_key#Clef du boss
item_boss_key_desc#Ouvre la porte du boss
item_sorcerer_hat#Chapeau d'enchanteur
item_sorcerer_hat_desc#Augmente la cadence de tir
item_velvet_boots#Bottes de velours
item_velvet_boots_desc#Augmente la vitesse
item_spell_dual#Sort: double-tir
item_spell_dual_desc#Tire deux projectiles
item_rage_amulet#Amulette de rage
item_rage_amulet_desc#Contre-attaque
item_displacement_gloves#Gants de déplacement
item_displacement_gloves_desc#La vitesse du porteur impacte la trajectoire
item_staff#Bâton d'ébène
item_staff_desc#Augmente les dégâts et la vitesse de tir
item_fairy#La fée Lilly
item_fairy_desc#Vous aide dans le donjon
item_leather_belt#Ceinture de cuir
item_leather_belt_desc#Augmente la cadence de tir
item_blood_snake#Serpent de sang
item_blood_snake_desc#Augmente les dégâts
item_gem_ice#Gemme de glace
item_gem_ice_desc#Attaque de glace (gèle)
item_gem_illusion#Gemme d'illusion
item_gem_illusion_desc#Attaque d'illusion(ignore murs et armures)
item_gem_stone#Gemme de pierre
item_gem_stone_desc#Attaque de pierre(repousse)
item_gem_lightning#Gemme de foudre
item_gem_lightning_desc#Attaque de foudre(rebondit)
item_fairy_ice#La fée Natacha
item_fairy_ice_desc#Vous aide dans le donjon
item_ring_ice#Anneau de saphir
item_ring_ice_desc#Augmente le pouvoir de glace
item_ring_stone#Anneau de quartz
item_ring_stone_desc#Augmente le pouvoir de pierre
item_ring_lightning#Anneau d'améthyste
item_ring_lightning_desc#Augmente le pouvoir de foudre
item_ring_illusion#Anneau d'obsidienne
item_ring_illusion_desc#Augmente le pouvoir d'illusion
item_spell_triple#Manuel de Triple-tir
item_spell_triple_desc#Tire trois projectiles
item_brooch_finesse#Barbe factice d'Archimage
item_brooch_finesse_desc#Chance de dégâts critiques (x2)
item_fairy_fire#La fée Alicia
item_fairy_fire_desc#Vous aide dans le donjon
item_fairy_target#La fée Scarlett
item_fairy_target_desc#Vous aide dans le donjon
item_robe_magician#Robe de magicien
item_robe_magician_desc#Augmente l'armure
item_gem_fire#Gemme de feu
item_gem_fire_desc#Attaque de feu (dégâts augmentés)
item_ring_fire#Anneau de rubis
item_ring_fire_desc#Augmente le pouvoir de feu
item_manual_staff#Manuel du bâton
item_manual_staff_desc#Augmente la portée
item_spell_teleport#Sort : Téléportation
item_spell_teleport_desc#Permet de se téléporter dans la pièce
item_spell_slime_explode#Sort: Invoquer Slime
item_spell_slime_explode_desc#Invoque un slime explosif
item_spell_fireball#Sort: Boule de feu
item_spell_fireball_desc#Envoie une boule de feu
item_spell_freeze#Sort: Geler monstres
item_spell_freeze_desc#Gèle les monstres
item_spell_earthquake#Sort: Séisme
item_spell_earthquake_desc#Fait trembler le donjon
item_spell_protection#Sort: Protection
item_spell_protection_desc#Invoque un bouclier magique
item_manual_slime#Manuel de maîtrise des slimes
item_manual_slime_desc#Les slimes ne vous visent plus
item_spell_dual_quick#Sort: Double-tir (rapide)
item_spell_dual_quick_desc#Tire deux projectiles (rapide)
item_spell_triple_quick#Sort: Triple-tir (rapide)
item_spell_triple_quick_desc#Tire trois projectiles (rapide)
item_manual_health#Manuel de santé
item_manual_health_desc#Gain de PV augmenté
item_rear_shot#Embout de bâton
item_rear_shot_desc#Tir arrière
item_book_random_shot#Sort: Tir aléatoire
item_book_random_shot_desc#Tire dans une direction aléatoire
item_spell_web#Sort: Toile d'araignée
item_spell_web_desc#Tire des toiles d'araignée
item_book_magic_i#Grimoire - Tome I
item_book_magic_i_desc#Réduit le délai entre deux sorts
item_book_magic_ii#Grimoire - Tome II
item_book_magic_ii_desc#Augmente la puissance du sort
item_sulfur#Soufre
item_sulfur_desc#Chance de faire exploser les cadavres
spell_teleport#téléportation
spell_slime_explode#invoquer slime
spell_fireball#boule de feu
spell_freeze#geler monstres
spell_earthquake#séisme
spell_protection#protection
spell_web#toile d'araignée
msg_level1_0#Votre quête commence !
msg_level1_1#"Les sorcières ont enlevé la fille de l'Archimage.
msg_level1_2#Je dois descendre dans leur antre et la secourir !"
msg_level2_0#La fille de l'Archimage
msg_level2_1#"J'arrive, je vais te sortir de là !
msg_level2_2#J'espère qu'elle est saine et sauve..."
msg_level3_0#La fille de l'Archimage
msg_level3_1#"Vous l'ai-je déjà dit ?
msg_level3_2#La fille de l'Archimage est la plus douce de l'Académie de Magie !"
msg_level4_0#L'Archimage
msg_level4_1#"L'Archimage est très sage, et est aussi mon mentor.
msg_level4_2#Il m'a appris que nous vivons dans le meilleur des monde."
msg_level5_0#La fille de l'Archimage
msg_level5_1#"Je me souviens d'elle et de moi, à l'Académie de Magie.
msg_level5_2#Enfants, nous jouions au mage guérisseur, hi hi !"
msg_level6_0#L'Archimage
msg_level6_1#"Mes parents sont décédés quand j'étais bébé.
msg_level6_2#L'Archimage m'a élevé comme si j'étais des siens."
msg_rats_bats_0#La vermine
msg_rats_bats_1#"Hey! Pourquoi faut-il toujours exterminer des rats et chauve-souris
msg_rats_bats_2#dans les Roguelikes ?"
msg_snakes_0#Les serpents
msg_snakes_1#"Je DETESTE les serpents!"
msg_witches_0#Les sorcières
msg_witches_1#"S.. Sorcières !!!"
msg_gold_0#Or
msg_gold_1#"♫ Money money money ♫
msg_gold_2#Je me demande si je peux acheter des trucs intéressants dans ce donjon..."
msg_familiar_0#Les fées
msg_familiar_1#"Oh ! De la compagnie !
msg_familiar_2#J'espère trouver d'autres alliés dans le donjon."
msg_butcher_0#Le Boucher porcin
msg_butcher_1#"Wow, ce gars est balèze !
msg_butcher_2#J'espère ne pas terminer en saucisses..."
msg_giant_slime_0#Le Slime géant
msg_giant_slime_1#"Je suis vert, énorme et je pue.
msg_giant_slime_2#Qui suis-je ?"
msg_cyclops_0#Le Cyclope de pierre
msg_cyclops_1#"Comment est-il entré dans cette pièce ?
msg_cyclops_2#Il est plus large que les portes !"
msg_wererat_0#Le Roi des Rats-garous
msg_wererat_1#"Il ressemble à ma vieille tante..."
msg_giant_spider_before_0#Une pièce vide
msg_giant_spider_before_1#"Y'a quelqu'un ? "
msg_giant_spider_after_0#L'Araignée géante
msg_giant_spider_after_1#"Je DETESTE les araignées"
msg_tuto_intro_0#Tutoriel: Bases
msg_tuto_intro_1#Utilisez ZQSD (standard) pour se déplacer dans le donjon.
msg_tuto_intro_2#Tirez avec les flèches (standard).
msg_tuto_items_0#Tutoriel: Objets
msg_tuto_items_1#Les objets améliorent le personnage ou lui octroient de nouveaux pouvoirs.
msg_tuto_items_2#trouvez ou achetez-en autant que possible.
msg_tuto_heal_0#Tutoriel: Santé
msg_tuto_heal_1#Vous avez perdu des points de vie.
msg_tuto_heal_2#Trouvez des moyens de guérir avant de mourir.
msg_tuto_shops_0#Tutoriel: Boutique
msg_tuto_shops_1#Vous pouvez trouver plusieurs boutiques dans le donjon.
msg_tuto_shops_2#Ici, vous dépenserez votre argent en objets et nourriture.
msg_tuto_boss_door_0#Tutoriel: Porte du Boss
msg_tuto_boss_door_1#D'ici, vous apercevez une porte dorée verrouillée.
msg_tuto_boss_door_2#Elle protège le Boss, trouvez la clef adéquate pour l'ouvrir.
msg_tuto_challenge_door_0#Tutoriel: Salle de Challenge
msg_tuto_challenge_door_1#Regardez la porte décorée ? C'est une salle de challenge.
msg_tuto_challenge_door_2#Vous pouvez y gagner des objets de valeur mais attention !
msg_tuto_shots_0#Tutoriel: Types de tir
msg_tuto_shots_1#Vous avez trouvé un nouveau type de tir.
msg_tuto_shots_2#Appuyez sur [sélection de tir] (standard: tab) pour changer de type de tir.
msg_tuto_spell_0#Tutoriel: Magie
msg_tuto_spell_1#Vous avez trouvé un nouveau sort.
msg_tuto_spell_2#Appuyez sur la touche de sort (standard: espace) pour le lancer.
msg_francky_0#La... Chose
msg_francky_1#Beurk... Il a l'air "fabriqué" à partir de morceaux de cadavres !
msg_tuto_tips_0#Tutoriel: Astuces
msg_tuto_tips_1#Le contrôle du temps (standard: Shift droit) permet de se déplacer plus vite.
msg_tuto_tips_2#Appuyez sur [Enter] pour fermer les boites de message.
enemy_type_bat#une chauve-souris
enemy_type_rat#un rat
enemy_type_rat_black#un rat noir
enemy_type_rat_helmet#un rat casqué
enemy_type_rat_black_helmet#un rat noir casqué
enemy_type_evil_flower#une fleur maléfique
enemy_type_evil_flower_ice#un edelweiss maléfique
enemy_type_snake#un serpent
enemy_type_snake_blood#un serpent de sang
enemy_type_slime#un slime
enemy_type_slime_red#un slime rouge
enemy_type_slime_blue#un slime bleu
enemy_type_slime_violet#un slime violet
enemy_type_imp_blue#un diablotin bleu
enemy_type_imp_red#un diablotin rouge
enemy_type_pumpkin#une citrouille démente
enemy_type_witch#une sorcière
enemy_type_witch_red#une sorcière rouge
enemy_type_cauldron#un chaudron
enemy_type_bubble#une bulle
enemy_type_boss_butcher#le Boucher porcin
enemy_type_boss_slime_giant#le Slime géant
enemy_type_boss_cyclops#le Cyclope de pierre
enemy_type_boss_rat_king#le Roi des Rats-garous
enemy_type_boss_spider_giant#l'Araignée géante
enemy_type_green_rat#un rat vert
enemy_type_rock_falling#un rocher tombant
enemy_type_rock_missile#un rocher lancé
enemy_type_spider_egg#un oeuf d'araignée tombant
enemy_type_spider_little#une araignée
enemy_type_spider_web#une toile d'araignée
enemy_type_ghost#un fantôme
enemy_type_zombie#un zombie
enemy_type_zombie_dark#un zombie sombre
enemy_type_francky#la Chose
enemy_type_himself#lui-même
source_explosion#une explosion
source_poison#du poison
dc_certificate#Certificat de décès
dc_killed_by#Tué par
dc_died_level#Mort au niveau
dc_after#après
dc_minutes#min. de jeu
dc_killed_monsters#Monstres vaincus
dc_gold#Or
dc_challenges#Défis relevés
player_name#Nom du joueur
player_name_desc#Modifier le nom du joueur
hi_scores#Hall of fame
hi_scores_desc#Meilleurs scores
credits#Crédits
credits_desc#Ecran des crédits
volume_sound#Volume du son
volume_sound_desc#Utiliser les flèches gauche/droite pour modifier le volume
volume_music#Volume de la musique
certificate_capture#Appuyez sur [F1] pour faire une copie du certificat dans un PNG
certificate_saved#Enregistré sous
msg_tuto_temple_0#Tutoriel: Temple
msg_tuto_temple_1#Au temple, vous pouvez vénérer des divinités et faire des donations.
msg_tuto_temple_2#Les divinités vous apporte leur aide et des bonus.
key_interact#interaction
interact_worship#Vénérer
interact_shop#Acheter
interact_donate#Donner 10 pièces
interact_donate_fail#(pas assez d'argent)
worshipping#Vous êtes maintenant un disciple de
divinity_healer_0#Pomonos le Juste
divinity_healer_1#Gardien de la vertue et protecteur des faibles.
divinity_healer_2#Il apprécie les dons, la souffrance, et le combat contre le mal.
divinity_fighter_0#Tello le Puissant
divinity_fighter_1#Seigneur des guerriers et de la force.
divinity_fighter_2#Il aime voir tomber les monstres et les titans.
divinity_ice_0#Mister Snow
divinity_ice_1#Divinité du Froid.
divinity_ice_2#Il apprécie l'usage de la glace.
divinity_stone_0#Gaya
divinity_stone_1#Divinité de la Terre et de la Pierre.
divinity_stone_2#Il apprécie l'usage de la pierre.
divinity_intervention_0#Intervention divine
divinity_intervention_1#intervient en votre faveur.
divinity_gift_0#Présent divin
divinity_gift_1#vous offre un présent.
item_floor_map#Carte du donjon
item_floor_map_desc#Révèle la carte de cet étage
item_alcohol#Absinthe
item_alcohol_desc#Vous rend temporairement plus fort
[german]
start_new_game#Neues Spiel starten
start_desc#Alter Speicherstand wird überschrieben !
restore#Speicherstand wiederherstellen
at#um
level#Level
begin_journey#Beginne deine Reise in einem neuen Verlies
config_keys#Steuerung
redef_input#Ändere die Tastenbelegung
exit_game#Spiel verlassen
return_to_desktop#Kehre zum Desktop zurück
key_configuration#Tastenbelegung
key_configuration_desc#Bitte belege die Tasten
key_configuration_insert#[Taste einsetzen]
key_configuration_done#FERTIG
key_move_up#Nach oben
key_move_down#Nach unten
key_move_left#Nach links
key_move_right#Nach rechts
key_fire_up#Schieße oben
key_fire_down#Schieße unten
key_fire_left#Schieße links
key_fire_right#Schieße rechts
key_fire_select#Schieße Auswahl
key_time#Zeitsteuerung
key_fire#Schießen (ein Knopf)
key_spell#Verzaubern
configure_game#Optionen
configure_game_desc#Ändere die Spieloptionen
config_back#Zurück
config_back_desc#Zurück zum Hauptmenü
config_lang#Sprache
config_lang_desc#Wähle mit linker und rechter Pfeiltaste aus
english#Englisch
french#Französisch
german#Deutsch
keys_move#Bewegen
keys_fire#Schießen
keys_select_1#Waffe
keys_select_2#wechseln
keys_time#Zeitsteuerung
play_again#Drücke [ENTER], um nochmal zu spielen / [ESC], um ins Hauptmenü zurückzukehren
items_found#Items
monsters_killed#Monster
congratulations_1#HERZLICHEN GLÜCKWUNSCH !
congratulations_2#Du hast dich der Demo Version gestellt und die Bosse getötet !
congratulations_3#Bis bald für neue Abenteuer !
by#von
critical#KRITISCH X2
poison#GIFT
merchant_speech_0#Bester Preis im gesamten Verlies!
merchant_speech_1#Willkommen im Pawn'n'Witches Shop!
merchant_speech_2#Schau dir unsere Waren an!
enemy_butcher#Schweinemetzger
enemy_giant_slime#Gigantischer Schleim
enemy_cyclops#Steinzyklop
enemy_rat_king#Werrattenkönig
enemy_giant_spider#Gigantische Spinne
item_copper#Kupfermünze
item_copper_desc#Eine Kupfermünze (Wert 1)
item_silver#Silbermünze
item_silver_desc#Eine Silbermünze (Wert 5)
item_gold#Goldmünze
item_gold_desc#Eine Goldmünze (Wert 10)
item_titan_heart#Herz des Titanen
item_titan_heart_desc#Erhöht die maximalen TP
item_elven_cookie#Elfenkeks
item_elven_cookie_desc#Regeneriert und erhöht die max. TP
item_apple#Apfel
item_apple_desc#Stellt 3 TP wieder her
item_bread#Brot
item_bread_desc#Stellt 7 TP wieder her
item_cheese#Käse
item_cheese_desc#Stellt 15 TP wieder her
item_boss_key#Boss-Schlüssel
item_boss_key_desc#Öffnet die Boss-Tür
item_sorcerer_hat#Hut des Zauberers
item_sorcerer_hat_desc#Erhöht die Feuerrate
item_velvet_boots#Samtschuhe
item_velvet_boots_desc#Erhöht die Geschwindigkeit
item_spell_dual#Zauber : Doppelter Schuss
item_spell_dual_desc#Schießt zwei Schüsse
item_rage_amulet#Wutamulett
item_rage_amulet_desc#Revanchiert sich bei Kontakt
item_displacement_gloves#Verschiebungs-Handschuhe
item_displacement_gloves_desc#Die Geschwindigkeit des Spielers beeinflusst die der Schüsse
item_staff#Elfenbeinstab
item_staff_desc#Erhöht Schussgeschwindigkeit und Schaden
item_fairy#Lilly-Fee
item_fairy_desc#Hilft dir im Verlies
item_leather_belt#Ledergürtel
item_leather_belt_desc#Erhöht die Feuerrate
item_blood_snake#Blutschlange
item_blood_snake_desc#Erhöht den Schaden
item_gem_ice#Eisjuwel
item_gem_ice_desc#Eisangriff (einfrieren)
item_gem_illusion#Illusionsjuwel
item_gem_illusion_desc#Illusionsangriff (ignoriert Wände)
item_gem_stone#Steinjuwel
item_gem_stone_desc#Steinangriff (rückstoßen)
item_gem_lightning#Blitzjuwel
item_gem_lightning_desc#Blitzangriff (abprallen)
item_fairy_ice#Natasha-Fee
item_fairy_ice_desc#Hilft dir im Verlies
item_ring_ice#Saphir Ring
item_ring_ice_desc#Erhöht die Eiskraft
item_ring_stone#Quarzring
item_ring_stone_desc#Erhöht die Steinkraft
item_ring_lightning#Amethystring
item_ring_lightning_desc#Erhöht die Blitzkraft
item_ring_illusion#Obsidianring
item_ring_illusion_desc#Erhöht die Illusionskraft
item_spell_triple#Zauber : Dreifacher Schuss
item_spell_triple_desc#Schießt drei Schüsse
item_brooch_finesse#Falscher Erzmagierbart
item_brooch_finesse_desc#Kritische Trefferchance (x2)
item_fairy_fire#Alicia-Fee
item_fairy_fire_desc#Hilft dir im Verlies
item_fairy_target#Scarlett-Fee
item_fairy_target_desc#Hilft dir im Verlies
item_robe_magician#Robe des Zauberers
item_robe_magician_desc#Erhöht die Rüstung
item_gem_fire#Feuerjuwel
item_gem_fire_desc#Feuerangriff (mehr Schaden)
item_ring_fire#Rubin Ring
item_ring_fire_desc#Erhöht die Feuerkraft
item_manual_staff#Handbuch des Zauberstabes
item_manual_staff_desc#Erhöht die Reichweite
item_spell_teleport#Spell: Teleport
item_spell_teleport_desc#Cast to teleport within the room
item_spell_slime_explode#Spell: Invoke Slime
item_spell_slime_explode_desc#Cast to invoke an explosive slime
spell_teleport#Teleportation
spell_slime_explode#invoke slime
item_spell_fireball#Zauber: Feuerball
item_spell_fireball_desc#Zauber, um einen Feuerball zu beschwören
item_spell_freeze#Zauber: Monster einfrieren
item_spell_freeze_desc#Zauber, um Monster einzufrieren
item_spell_earthquake#Zauber: Erdbeben
item_spell_earthquake_desc#Zauber, um das Verlies durchzuschütteln
item_spell_protection#Zauber: Magisches Schild
item_spell_protection_desc#Zauber, um ein magisches Schild zu beschwören
spell_fireball#Feuerball
spell_freeze#Monster einfrieren
spell_earthquake#Erdbeben
spell_protection#Magisches Schild
msg_level1_0#Deine Aufgabe beginnt!
msg_level1_1#"Hexen haben die Tochter des Erzmagiers entführt und sie in ihr Lager gebracht.
msg_level1_2#Ich muss sie retten!"
msg_level2_0#Die Tochter des Erzmagiers
msg_level2_1#"Ich komme sofort, um dich zu befreien !
msg_level2_2#Hoffentlich ist sie wohlbehalten..."
msg_level3_0#Die Tochter des Erzmagiers
msg_level3_1#"Hab ich es dir je erzählt?
msg_level3_2#Die Tochter des Erzmagiers ist das süßeste Mädchen der magischen Akademie!"
msg_level4_0#Der Erzmagier
msg_level4_1#"Der Erzmagier ist ein sehr weiser Mann, und zugleich mein Mentor.
msg_level4_2#Er hat mich gelehrt, dass wir auf der besten Welt leben."
msg_level5_0#Die Tochter des Erzmagiers
msg_level5_1#"Ich erinnere mich an die Tochter des Erzmagiers und mich, damals auf der magischen Akademie.
msg_level5_2#Wir haben beim Heilmagier gespielt, hi hi !"
msg_level6_0#Der Erzmagier
msg_level6_1#"Meine Eltern starben, als ich noch ein Baby war.
msg_level6_2#Der Erzmagier hat mich wie seinen eigenen Sohn aufgezogen."
msg_rats_bats_0#Monster
msg_rats_bats_1#"Hey! Warum müssen wir immer Ratten und Fledermäuse ausrotten
msg_rats_bats_2#in diesen Schurken Spielen ?"
msg_snakes_0#Schlangen
msg_snakes_1#"Ich HASSE Schlangen!"
msg_witches_0#Hexen
msg_witches_1#"S... Hexen !!!"
msg_gold_0#Gold
msg_gold_1#"♫ Money money money ♫
msg_gold_2#Ich frage mich, ob ich nützliche Gegenstände in diesem Verlies kaufen kann..."
msg_familiar_0#Feen
msg_familiar_1#"Oh! Ich habe Gesellschaft!
msg_familiar_2#Ich hoffe ich finde noch andere Verbündete im Verlies."
msg_butcher_0#Der Schweinemetzger
msg_butcher_1#"Wow, das ist ein großer Typ!
msg_butcher_2#Ich hoffe ich werde kein Hackfleisch..."
msg_giant_slime_0#Der gigantische Schleim
msg_giant_slime_1#"Ich bin grün, riesig und stinke.
msg_giant_slime_2#Was ich bin ?"
msg_cyclops_0#Der Steinzyklop
msg_cyclops_1#"Wie ist es in dem Raum gelaufen?
msg_cyclops_2#Es ist größer und länger als das Tor!"
msg_wererat_0#Die Werratte
msg_wererat_1#"Sieht aus wie meine alte Tante..."
msg_giant_spider_before_0#Der leere Raum
msg_giant_spider_before_1#"Ist hier jemand? "
msg_giant_spider_after_0#Die riesige Spinne
msg_giant_spider_after_1#"Ich HASSE Spinnen"
msg_tuto_intro_0#Tutorial: Wesentliches
msg_tuto_intro_1#Benutze WASD (Standard), um dich im Verlies zu bewegen.
msg_tuto_intro_2#Feuere mit den Pfeiltasten (Standard).
msg_tuto_items_0#Tutorial: Gegenstände
msg_tuto_items_1#Gegenstände verbessern deinen Charakter oder geben dir neue Kräfte.
msg_tuto_items_2#Finde oder kaufe so viele du kannst.
msg_tuto_heal_0#Tutorial: Leben
msg_tuto_heal_1#Du hast einige Trefferpunkte verloren.
msg_tuto_heal_2#Finde etwas um dich zu heilen, bevor du stirbst.
msg_tuto_shops_0#Tutorial: Geschäfte
msg_tuto_shops_1#Du kannst viele Geschäfte im Verlies finden.
msg_tuto_shops_2#Hier kannst du Geld ausgeben, um Gegenstände oder Essen zu kaufen.
msg_tuto_boss_door_0#Tutorial: Boss-Tür
msg_tuto_boss_door_1#Von hier aus kannst du eine geschlossene, goldene Tür sehen.
msg_tuto_boss_door_2#Hier ist der Boss von dieser Etage, aber du brauchst den goldenen Schlüssel, um die Tür zu öffnen.
msg_tuto_challenge_door_0#Tutorial: Raum der Herausforderung
msg_tuto_challenge_door_1#Schau auf die dekorative Tür. Es ist ein Raum der Herausforderung.
msg_tuto_challenge_door_2#Du kannst hier wertvolle Belohnungen erhalten, aber sei vorsichtig!
msg_tuto_shots_0#Tutorial: Schussarten
msg_tuto_shots_1#Du hast eine neue Schussart gefunden.
msg_tuto_shots_2#Drücke [Waffe wechseln] (Standard: Tab), um zwischen den Schussarten zu wechseln.
msg_tuto_spell_0#Tutorial: Zauber
msg_tuto_spell_1#Du hast einen magischen Zauber gefunden.
msg_tuto_spell_2#Drücke die Zaubertaste (Standard: Leertaste), um einen Zauber zu beschwören.
enemy_type_bat#eine Fledermaus
enemy_type_rat#eine Ratte
enemy_type_rat_black#eine schwarze Ratte
enemy_type_rat_helmet#eine Ratte mit Helm
enemy_type_rat_black_helmet#eine schwarze Ratte mit Helm
enemy_type_evil_flower#eine böse Blume
enemy_type_evil_flower_ice#eine böse Edelweiß
enemy_type_snake#eine Schlange
enemy_type_snake_blood#eine Blutschlange
enemy_type_slime#ein Schleim
enemy_type_slime_red#ein roter Schleim
enemy_type_slime_blue#ein blauer Schleim
enemy_type_slime_violet#ein violetter Schleim
enemy_type_imp_blue#ein blauer Imp
enemy_type_imp_red#ein roter Imp
enemy_type_pumpkin#ein verrückter Kürbis
enemy_type_witch#eine Hexe
enemy_type_witch_red#eine rote Hexe
enemy_type_cauldron#ein großer Kessel
enemy_type_bubble#eine Blase
enemy_type_boss_butcher#der Schweinemetzger
enemy_type_boss_slime_giant#der Gigantische Schleim
enemy_type_boss_cyclops#der Steinzyklop
enemy_type_boss_rat_king#der Werrattenkönig
enemy_type_boss_spider_giant#die Gigantische Spinne
enemy_type_green_rat#eine grüne Ratte
enemy_type_rock_falling#ein fallender Fels
enemy_type_rock_missile#ein geworfener Fels
enemy_type_spider_egg#ein fallendes Spinnenei
enemy_type_spider_little#eine Spinne
enemy_type_spider_web#ein Spinnennetz
enemy_type_ghost#ein Geist
enemy_type_zombie#ein Zombie
enemy_type_zombie_dark#ein dunkler Zombie
enemy_type_francky#das Ding
enemy_type_himself#selbst
source_explosion#Explosion
source_poison#Gift
enemy_francky#Das Ding
enemy_francky_head#Ding's Kopf
item_apple_green#Grüner Apfel
item_apple_green_desc#Regeneriert 3 TP und heilt Vergiftungen
item_manual_slime#Handbuch der Schleimbeherrschung
item_manual_slime_desc#Schleime zielen nicht mehr auf dich
item_spell_dual_quick#Zauberbuch der schnellen Doppelschüsse
item_spell_dual_quick_desc#Schießt zwei Schüsse (schnell)
item_spell_triple_quick#Zauberbuch der schnellen Dreifachschüsse
item_spell_triple_quick_desc#Schießt drei Schüsse (schnell)
item_manual_health#Gesundheitshandbuch
item_manual_health_desc#Gesunde Gegenstände bringen mehr TP
item_rear_shot#Mitarbeiter Kappe
item_rear_shot_desc#Schießt einen Rückwärtsschuss
item_book_random_shot#Zauberbuch der Zufallschüsse
item_book_random_shot_desc#Schießt einen Schuss in eine zufällige Richtung
item_spell_web#Zauber: Spinnennetz
item_spell_web_desc#Zaubere um ein Spinnennetz zu werfen
item_book_magic_i#Zauberbuch - Wälzer I
item_book_magic_i_desc#Verringert die Abklingzeit der Zauber
item_book_magic_ii#Zauberbuch - Wälzer II
item_book_magic_ii_desc#Erhöht die Kraft der Zauber
item_sulfur#Schwefel
item_sulfur_desc#Kann Leichen zum Explodieren bringen
spell_web#Spinnennetz
tuto_reset#Tutorial zurücksetzen
tuto_reset_desc#Setzt das Tutorial zurück
msg_francky_0#Das... Ding
msg_francky_1#Ihh... Es sieht aus als wäre es aus verschiedenen Körperteilen gemacht !
msg_tuto_tips_0#Tutorial: Tipps
msg_tuto_tips_1#Benutze die Zeitkontrolle (Standard: RShift) um schneller zu reisen.
msg_tuto_tips_2#Drücke [Enter] um Nachrichtenboxen sofort zu schließen.
menu_continue#Fortfahren
menu_continue_desc#Mit dem Spiel fortfahren
menu_save_quit#Speichern und beenden
menu_save_quit_desc#Speichern und zum Hauptbildschirm zurückkehren
menu_quit#Beenden ohne speichern
menu_quit_desc#Zum Hauptbildschirm zurückkehren ohne speichern
inventory#Inventar
dc_certificate#Todeszertifikat
dc_killed_by#Getötet hat dich
dc_died_level#Gestorben auf Level
dc_after#nach
dc_minutes#Min. vom Spiel
dc_killed_monsters#Besiegte Monster
dc_gold#Gold
dc_challenges#Abgeschlossene Herausforderungen
player_name#Spielername
player_name_desc#Ändere den Spielernamen
hi_scores#Ruhmeshalle
hi_scores_desc#Highscores
credits#Credits
credits_desc#Credits Bildschirm
volume_sound#Sound Lautstärke
volume_sound_desc#Benutze die linke und rechte Pfeiltaste um die Lautstärke zu regeln
volume_music#Musik Lautstärke
certificate_capture#Drücke [F1] um das Zertifikat als PNG Bild zu speichern
certificate_saved#Speicher auf
msg_tuto_temple_0#Tutorial: Tempel
msg_tuto_temple_1#Der Tempel ist der Ort, wo man zu einem Gott beten oder spenden kann.
msg_tuto_temple_2#Götter können dir helfen und Boni vergeben.
key_interact#interagiere
interact_worship#Anbetung
interact_shop#Kaufe
interact_donate#Spende 10 Gold
interact_donate_fail#(nicht genug Gold)
worshipping#Du bist nun ein Anbeter von
divinity_healer_0#Pomonos der Rechte
divinity_healer_1#Wächter des Rechts und Schutzpatron der Armen.
divinity_healer_2#Er würdigt Spenden, Leid und den Kampf gegen das Böse.
divinity_fighter_0#Tello der Starke
divinity_fighter_1#Gebieter der Kämpfer und der Starken.
divinity_fighter_2#Er würdigt im Kampf gefallene Monster und Titanen.
divinity_ice_0#Mister Schnee
divinity_ice_1#Gott der Kälte.
divinity_ice_2#Er würdigt den Einsatz von Eis.
divinity_stone_0#Gaya
divinity_stone_1#Gott des Gesteines und der Erde.
divinity_stone_2#Er würdigt den Einsatz von Gestein.
divinity_intervention_0#Göttliche Intervention
divinity_intervention_1#schreitet zu deinem Gunsten ein.
divinity_gift_0#Göttliche Gabe
divinity_gift_1#gewährt dir ein Geschenk.
item_floor_map#Verlieskarte
item_floor_map_desc#Offenbart die Karte der derzeitigen Etage
item_alcohol#Absinth
item_alcohol_desc#erhöht vorübergehend den Schaden
[spanish]
start_new_game#Empezar nueva partida
start_desc#La partida anterior se perderá
restore#Restaurar partida
at#en
level#nivel
begin_journey#Comienza tu aventura en un nuevo calabozo
config_keys#Configurar teclas
redef_input#Redefinir controles del jugador
exit_game#Salir del juego
return_to_desktop#Volver al escritorio
key_configuration#Configuración de teclas
key_configuration_desc#Por favor configure las teclas
key_configuration_insert#[presione tecla]
key_configuration_done#LISTO
key_move_up#moverse arriba
key_move_down#moverse abajo
key_move_left#moverse a la izquierda
key_move_right#moverse a la derecha
key_fire_up#disparar arriba
key_fire_down#disparar abajo
key_fire_left#disparar a la izquierda
key_fire_right#disparar a la derecha
key_fire_select#seleccionar disparo
key_time#control del tiempo
key_fire#disparo (un botón)
configure_game#Configuración
configure_game_desc#Cambia las opciones del juego
config_back#Volver
config_back_desc#Volver al menú principal
config_lang#Idioma
config_lang_desc#Elije usando las teclas izquierda y derecha
english#Inglés
french#Francés
german#Alemán
spanish#Español
russian#Ruso
keys_move#mover
keys_fire#disparar
keys_select_1#disparo
keys_select_2#selector
keys_time#control de tiempo
key_spell#invocar un conjuro
play_again#Presiona [ENTER] para jugar de nuevo / [ESC] para volver al menú
items_found#Items
monsters_killed#Monstruos
congratulations_1#FELICIDADES !
congratulations_2#Te haz enfrentado a este demo y has derrotado a los jefes!
congratulations_3#Nos veremos luego en una nueva aventura !
by#por
critical#CRÍTICO X2
poison#VENENO
merchant_speech_0#¡Los mejores precios de todo el calabozo!
merchant_speech_1#¡Bienvenido a la tienda Pawn'n'Witches!
merchant_speech_2#¡Echa una mirada a nuestra mercancía!
enemy_butcher#Cerdo Carnicero
enemy_giant_slime#Baba Gigante
enemy_cyclops#Cíclope de piedra
enemy_rat_king#Hombre Rata Rey
enemy_giant_spider#Araña gigante
item_copper#Moneda de cobre
item_copper_desc#Una moneda de cobre (valor 1)
item_silver#Moneda de plata
item_silver_desc#Una moneda de plata (valor 5)
item_gold#Moneda de oro
item_gold_desc#Una moneda de oro (valor 10)
item_titan_heart#Corazón de Titán
item_titan_heart_desc#Incrementa PV máximos
item_elven_cookie#Galleta Elven
item_elven_cookie_desc#Restaura y aumenta PV máximos
item_apple#Manzana
item_apple_desc#Restaura 3 PV
item_bread#Pan
item_bread_desc#Restaura 7 PV
item_cheese#Queso
item_cheese_desc#Restaura 15 PV
item_boss_key#Llave del jefe
item_boss_key_desc#Abre la puerta del jefe
item_sorcerer_hat#Sombrero del hechicero
item_sorcerer_hat_desc#Aumenta velocidad de disparo
item_velvet_boots#Botas de terciopelo
item_velvet_boots_desc#Aumenta la velocidad
item_spell_dual#Conjuro : Rayo doble
item_spell_dual_desc#Dispara dos rayos
item_rage_amulet#Amuleto de furia
item_rage_amulet_desc#Contraataca
item_displacement_gloves#Guantes de desplazamiento
item_displacement_gloves_desc#La velocidad del jugador afecta la velocidad del proyectil
item_staff#Báculo Ébano
item_staff_desc#Aumenta la velocidad y el daño del rayo
item_fairy#Hada Lilly
item_fairy_desc#Te ayuda en el calabozo
item_leather_belt#Cinturón de cuero
item_leather_belt_desc#Aumenta la velocidad de disparo
item_blood_snake#Serpiente de sangre
item_blood_snake_desc#Aumenta el daño
item_gem_ice#Gema de hielo
item_gem_ice_desc#Ataque de hielo (congelar)
item_gem_illusion#Gema de ilusión
item_gem_illusion_desc#Ataque de ilusión (ignora paredes y armaduras)
item_gem_stone#Gema de piedra
item_gem_stone_desc#Ataque de piedra (repeler)
item_gem_lightning#Gema de trueno
item_gem_lightning_desc#Ataque de trueno (rebote)
item_fairy_ice#Hada Natasha
item_fairy_ice_desc#Te ayuda en el calabozo
item_ring_ice#Anillo de safiro
item_ring_ice_desc#Aumenta el poder del hielo
item_ring_stone#Anillo de cuarso
item_ring_stone_desc#Aumenta el poder de la piedra
item_ring_lightning#Anillo de amatista
item_ring_lightning_desc#Aumenta el poder del trueno
item_ring_illusion#Anillo de obsidiana
item_ring_illusion_desc#Aumenta el poder de la ilusión
item_spell_triple#Conjuro : Rayo triple
item_spell_triple_desc#Dispara tres rayos
item_brooch_finesse#Barba falsa de archimago
item_brooch_finesse_desc#Probabilidad de disparo crítico (x2)
item_fairy_fire#Hada Alicia
item_fairy_fire_desc#Te ayuda en el calabozo
item_fairy_target#Hada Scarlett
item_fairy_target_desc#Te ayuda en el calabozo
item_robe_magician#Bata del Mago
item_robe_magician_desc#Aumenta armadura
item_gem_fire#Gema de fuego
item_gem_fire_desc#Ataque de fuego (más daño)
item_ring_fire#Anillo de rubí
item_ring_fire_desc#Aumenta el poder del fuego
item_manual_staff#Manual del báculo
item_manual_staff_desc#Aumenta rango de disparo
item_spell_teleport#Conjuro: Teletransportación
item_spell_teleport_desc#Invoca teletransportarse dentro de la habitación
item_spell_slime_explode#Conjuro: Invocar baba
item_spell_slime_explode_desc#Invoca una baba explosiva
spell_teleport#Teletransportación
spell_slime_explode#Invocar baba
spell_fireball#bola de fuego
spell_freeze#congelar monstruos
spell_earthquake#terremoto
spell_protection#escudo mágico
item_spell_fireball#Conjuro: Bola de fuego
item_spell_fireball_desc#Invocar para lanzar una bola de fuego
item_spell_freeze#Conjuro: Congelar monstruos.
item_spell_freeze_desc#Invocar para congelar a los monstruos.
item_spell_earthquake#Conjuro: Terremoto
item_spell_earthquake_desc#Invocar para hacer que el calabozo tiemble
item_spell_protection#Conjuro: Escudo mágico
item_spell_protection_desc#Invocar para crear un escudo mágico
msg_level1_0#Tu expedición comienza!
msg_level1_1#"Brujos han abducido a la hija del Archimago y la han llevado a la guarida.
msg_level1_2#Yo debo rescatarla!"
msg_level2_0#La hija del Archimago
msg_level2_1#"¡Voy ahora mismo a rescatarte!
msg_level2_2#Esperemos que ella esté sana y salva..."
msg_level3_0#La hija del Archimago
msg_level3_1#"¿No te lo he contado?
msg_level3_2#La hija del Archimago es la mujer más dulce de la Academia de Magia!"
msg_level4_0#El Archimago
msg_level4_1#"El Archimago es un hombre muy sabio, y además es mi mentor.
msg_level4_2#Él me ha enseñado que vivimos en lo mejor del mundo."
msg_level5_0#La hija del Archimago
msg_level5_1#"Recuerdo a la hija del Archimago conmigo, de vuelta en la Academia de Magia.
msg_level5_2#Solíamos jugar cerca del mago sanador."
msg_level6_0#El Archimago
msg_level6_1#"Mis padres fallecieron cuando yo era un bebé.
msg_level6_2#El Archimago me crió como si fuera su propio hijo."
msg_rats_bats_0#Monstruos
msg_rats_bats_1#"¡Oye! ¿Por qué siempre tenemos que matar ratas
msg_rats_bats_2#o murciélagos en estos juegos tipo Rogue?"
msg_snakes_0#Serpientes
msg_snakes_1#"ODIO a las serpientes!"
msg_witches_0#Brujas
msg_witches_1#"Pu... Brujas !!!"
msg_gold_0#Oro
msg_gold_1#"♫ Money money money ♫
msg_gold_2#Me pregunto si puedo comprar cosas útiles en este calabozo..."
msg_familiar_0#Hadas
msg_familiar_1#"¡Oh, tengo compañía!
msg_familiar_2#Ojalá encuentre a más aliados en este calabozo."
msg_butcher_0#El Cerdo Carnicero
msg_butcher_1#"¡Wow, este tipo si que es grandote!
msg_butcher_2#Espero no terminar hecho salchichas..."
msg_giant_slime_0#La Baba Gigante
msg_giant_slime_1#"Soy verde, grande y apesto.
msg_giant_slime_2#¿Qué soy?"
msg_cyclops_0#El Cíclope de piedra
msg_cyclops_1#"¿Cómo se pudo meter en la habitación?
msg_cyclops_2#¡Es más grande que la puerta!"
msg_wererat_0#El Hombre Rata
msg_wererat_1#"Se parece a mi vieja tía..."
msg_giant_spider_before_0#La habitación vacía
msg_giant_spider_before_1#"¿Hay alguien ahí? "
msg_giant_spider_after_0#La Araña Gigante
msg_giant_spider_after_1#"ODIO a las arañas"
msg_tuto_intro_0#Tutorial: Cosas básicas
msg_tuto_intro_1#Usa WASD (por defecto) para moverse dentr del calabozo.
msg_tuto_intro_2#Dispara usando las flechas (por defecto).
msg_tuto_items_0#Tutorial: Ítems
msg_tuto_items_1#Ítems mejoran a tu personaje o te dan nuevos poderes.
msg_tuto_items_2#Encuentra o compra la mayor cantidad que puedas.
msg_tuto_heal_0#Tutorial: Puntos de vida
msg_tuto_heal_1#Haz perdido algunos puntos de vida.
msg_tuto_heal_2#Encuentra algo para curarte antes de que mueras.
msg_tuto_shops_0#Tutorial: Tiendas
msg_tuto_shops_1#Puedes encontrar varias tiendas en el calabozo.
msg_tuto_shops_2#Aquí puedes gastar dinero para comprar ítems o comida.
msg_tuto_boss_door_0#Tutorial: Puerta del Jefe
msg_tuto_boss_door_1#Desde aquí puedes ver la puerta dorada cerrada.
msg_tuto_boss_door_2#Esa es la habitación del jefe, pero necesitas la llave dorada para entrar.
msg_tuto_challenge_door_0#Tutorial: Habitación de Desafíos
msg_tuto_challenge_door_1#Mira la puerta decorada. Es una habitación de desafíos.
msg_tuto_challenge_door_2#Puedes obtener buenas recompenzas ahí, ¡Pero entra con precaución!
msg_tuto_shots_0#Tutorial: Tipos de disparo
msg_tuto_shots_1#Haz encontrado un nuevo tipo de disparo.
msg_tuto_shots_2#Presiona la tecla de seleccionar disparos (por defecto: Tab) para cambiar entre tipos de disparo.
msg_tuto_spell_0#Tutorial: Conjuros
msg_tuto_spell_1#Haz encontrado un conjuro mágico.
msg_tuto_spell_2#Presiona la tecla de conjuros (por defecto: Espacio) para realizar el conjuro.
enemy_type_bat#un murciélago
enemy_type_rat#una rata
enemy_type_rat_black#una rata negra
enemy_type_rat_helmet#una rata con casco
enemy_type_rat_black_helmet#una rata negra con casco
enemy_type_evil_flower#una flor malvada
enemy_type_evil_flower_ice#una flor de las nieves malvada
enemy_type_snake#una serpiente
enemy_type_snake_blood#una serpiente ensangrentada
enemy_type_slime#una baba
enemy_type_slime_red#una baba roja
enemy_type_slime_blue#una baba azul
enemy_type_slime_violet#una baba violeta
enemy_type_imp_blue#un diablillo azul
enemy_type_imp_red#un diablillo rojo
enemy_type_pumpkin#una calabaza loca
enemy_type_witch#una bruja
enemy_type_witch_red#una bruja roja
enemy_type_cauldron#un caldero
enemy_type_bubble#una burbuja
enemy_type_boss_butcher#el Cerdo Carnicero
enemy_type_boss_slime_giant#la Baba Gigante
enemy_type_boss_cyclops#el Cíclope de piedra.
enemy_type_boss_rat_king#el Rey Hombre-Rata
enemy_type_boss_spider_giant#la Araña Gigante
enemy_type_green_rat#una rata verde
enemy_type_rock_falling#una roca cayendo
enemy_type_rock_missile#una roca lanzable
enemy_type_spider_egg#un huevo de araña cayendo
enemy_type_spider_little#una araña
enemy_type_spider_web#una tela-araña
enemy_type_ghost#un fantasma
enemy_type_zombie#un zombie
enemy_type_zombie_dark#un zombie oscuro
enemy_type_francky#la Cosa
enemy_type_himself#él mismo
source_explosion#explosión
source_poison#veneno
enemy_francky#La Cosa
enemy_francky_head#La cabeza de La Cosa
item_apple_green#Manzana verde
item_apple_green_desc#Restaura 3 PV y cura el veneno
item_manual_slime#Manual de Maestría de Baba
item_manual_slime_desc#Las babas ya no te atacan directamente
item_spell_dual_quick#El libro de los rayos rápidos dobles
item_spell_dual_quick_desc#Dispara dos rayos (rápido)
item_spell_triple_quick#El libro de los rayos rápidos triples
item_spell_triple_quick_desc#Dispara tres rayos (rápido)
item_manual_health#Manual de Salud
item_manual_health_desc#Los objetos de salud dan más PV
item_rear_shot#Gorra del váculo
item_rear_shot_desc#Dispara un rayo hacia trás
item_book_random_shot#Libro del disparo al azar
item_book_random_shot_desc#Dispara un rayo en una dirección al azar
item_spell_web#Conjuro: Telaraña
item_spell_web_desc#Invocar para lanzar telarañas
item_book_magic_i#Libro de magia - Tomo I
item_book_magic_i_desc#Disminuye el tiempo de espera de los conjuros
item_book_magic_ii#Libro de magia - Tomo II
item_book_magic_ii_desc#Aumenta el poder de los conjuros
item_sulfur#Sulfuro
item_sulfur_desc#Puede hacer que los cadáveres exploten
spell_web#telaraña
tuto_reset#Resetear tutorial
tuto_reset_desc#Resetea el tutorial
msg_francky_0#La... Cosa
msg_francky_1#Yuck... ¡Parece como si estuviera hecho con partes de distintos cuerpos!
msg_tuto_tips_0#Tutorial: Consejos
msg_tuto_tips_1#Usa el Control del Tiempo (por defecto: RShift) para viajar rápidamente.
msg_tuto_tips_2#Presiona [Enter] para cerrar el cuadro de mensajes inmediatamente.
menu_continue#Continuar
menu_continue_desc#Continúa con el juego
menu_save_quit#Guardar y salir
menu_save_quit_desc#Guarda la partida y se vuelve al menú principal
menu_quit#Salir sin guardar
menu_quit_desc#Vuelve al menú principal sin guardar la partida
inventory#Inventario
dc_certificate#Certificado de defunción
dc_killed_by#Matado por
dc_died_level#Muerto en nivel
dc_after#tras
dc_minutes#mins. de juego
dc_killed_monsters#Monstruos asesinados
dc_gold#Oro
dc_challenges#Desafíos completados
player_name#Nombre del jugador
player_name_desc#Modifica el nombre del jugador
hi_scores#Salón de la fama
hi_scores_desc#Mejores puntajes
credits#Créditos
credits_desc#Pantalla de créditos
volume_sound#Volumen del sonido
volume_sound_desc#Usa las flechas izquierda/derecha para cambiar el volumen
volume_music#Volumen de la música
certificate_capture#Presione [F1] para guardar el certificado en un archivo PNG
certificate_saved#Guardado en
msg_tuto_temple_0#Tutorial: Templo
msg_tuto_temple_1#El templo es el lugar en donde puedes venerar a una divinidad o donar.
msg_tuto_temple_2#Las Divinidades te pueden ayudar y te dan bonificaciones.
key_interact#interactuar
interact_worship#Venerar
interact_shop#Comprar
interact_donate#Donar 10 de oro
interact_donate_fail#(no hay suficiente oro)
worshipping#Ahora eres un venerador de
divinity_healer_0#Pomonos el Honrado
divinity_healer_1#Guardián de la honradez and patrocinador de los débiles.
divinity_healer_2#Él aprecia las donaciones, el sufrimiento y la lucha contra el mal.
divinity_fighter_0#Tello el Poderoso
divinity_fighter_1#Señor de los guerreros y los fuertes.
divinity_fighter_2#Él aprecia monstruos y titanes cayendo en la batalla.
divinity_ice_0#Señor Nieve
divinity_ice_1#Divinidad de la frialdad.
divinity_ice_2#Él aprecia el uso del hielo.
divinity_stone_0#Gaya
divinity_stone_1#Divinidad de la piedra y de la tierra.
divinity_stone_2#Él aprecia el uso de la piedra.
divinity_intervention_0#Intervención divina.
divinity_intervention_1#interviene a tu favor.
divinity_gift_0#Regalo divino.
divinity_gift_1#te concede un regalo.
item_floor_map#Mapa del calabozo
item_floor_map_desc#Revela el mapa del piso actual.
item_alcohol#Absenta
item_alcohol_desc#aumenta los daños temporalmente.
[russian]
start_new_game#Начать новую игру
start_desc#Старая игра будет стёрта
restore#Продолжить игру
at#в
level#Уровень
begin_journey#Начните ваше приключение в новом подземелье
config_keys#Настройка управления
redef_input#Сконфигурируйте управление игры
exit_game#Выход из игры
return_to_desktop#Выйти в ОС
key_configuration#Конфигурация клавиш
key_configuration_desc#Пожалуйста, задайте управление
key_configuration_insert#[нажмите клавишу]
key_configuration_done#ГОТОВО
key_move_up#Движение вверх
key_move_down#Движение вниз
key_move_left#Движение влево
key_move_right#Движение вправо
key_fire_up#Выстрел вверх
key_fire_down#Выстрел вниз
key_fire_left#Выстрел влево
key_fire_right#Выстрел вправо
key_fire_select#Выбор оружия
key_time#Ускорение времени
key_fire#Выстрел в направлении движения
key_spell#Произнести заклинание
configure_game#Конфигурация
configure_game_desc#Изменение параметров игры
config_back#Назад
config_back_desc#Назад в главное меню
config_lang#Язык
config_lang_desc#Выберите с помощью клавиш влево и вправо
russian#Русский
keys_move#движение
keys_fire#выстрел
keys_select_1#выбор
keys_select_2#оружия
keys_time#ускорение
play_again#Нажмите [ENTER] чтобы сыграть снова / [ESC] чтобы выйти в меню
items_found#Предметы
monsters_killed#Монстры
congratulations_1#ПОЗДРАВЛЯЕМ !
congratulations_2#Вы прошли демо и победили всех боссов !
congratulations_3#Скоро увидимся с новыми приключениями !
by#
critical#КРИТИЧЕСКИЙ УДАР X2
poison#ЯД
merchant_speech_0#Лучшие цены во всем подземелье!
merchant_speech_1#Добро пожаловать в магазин "Ведьмы и пешки"!
merchant_speech_2#Да вы только взгляните на наш товар!
enemy_butcher#Свин-мясник
enemy_giant_slime#Гигантский слизень
enemy_cyclops#Каменный циклоп
enemy_rat_king#Король веркрыс
enemy_giant_spider#Гигантский паук
item_copper#Медная монета
item_copper_desc#Медная монета (ценность 1)
item_silver#Серебряная монета
item_silver_desc#Серебряная монета (ценность 5)
item_gold#Золотая монета
item_gold_desc#Золотая монета (ценность 10)
item_titan_heart#Сердце титана
item_titan_heart_desc#Увеличивает максимальный уровень HP
item_elven_cookie#Печенье эльфов
item_elven_cookie_desc#Восстанавливает HP и увеличивает его максимальный уровень
item_apple#Яблоко
item_apple_desc#Восстанавливает 3 HP
item_bread#Хлеб
item_bread_desc#Восстанавливает 7 HP
item_cheese#Сыр
item_cheese_desc#Восстанавливает 15 HP
item_boss_key#Ключ Босса
item_boss_key_desc#Открывает врата в комнату Босса
item_sorcerer_hat#Шляпа мага
item_sorcerer_hat_desc#Увеличивает скорость стрельбы
item_velvet_boots#Бархатные сапоги
item_velvet_boots_desc#Увеличивает скорость
item_spell_dual#Заклинание : Двойной выстрел
item_spell_dual_desc#Позволяет стрелять двойным снарядом
item_rage_amulet#Амулет ярости
item_rage_amulet_desc#Месть
item_displacement_gloves#Перчатки перемещения
item_displacement_gloves_desc#Скорость персонажа влияет на скорость снарядов
item_staff#Эбонитовый посох
item_staff_desc#Увеличивает скорость снаряда и урон
item_fairy#Фея Лилли
item_fairy_desc#Помогает вам в подземелье
item_leather_belt#Кожаный ремень
item_leather_belt_desc#Увеличивает скорость стрельбы
item_blood_snake#Кровавый змей
item_blood_snake_desc#Увеличивает урон
item_gem_ice#Лёд
item_gem_ice_desc#Ледяная атака (заморозка)
item_gem_illusion#Камень иллюзий
item_gem_illusion_desc#Иллюзтонная атака (Игнорирует стены и броню)
item_gem_stone#Камень
item_gem_stone_desc#Каменная атака (отброс)
item_gem_lightning#Камень молний
item_gem_lightning_desc#Атака молний (отражение)
item_fairy_ice#Фея Наташа
item_fairy_ice_desc#Помогает вам в подземелье
item_ring_ice#Кольцо с сапфиром
item_ring_ice_desc#Увеличивает силу льда
item_ring_stone#Кольцо с кварцем
item_ring_stone_desc#Увеличивает силу камня
item_ring_lightning#Кольцо с аметистом
item_ring_lightning_desc#Увеличивает силу молний
item_ring_illusion#Кольцо с обсидианом
item_ring_illusion_desc#Увеличивает силу иллюзий
item_spell_triple#Заклинание : Тройной выстрел
item_spell_triple_desc#Позволяет стрелять тройным снарядом
item_brooch_finesse#Фальшивая борода архимага
item_brooch_finesse_desc#Шанс критического попадания (x2)
item_fairy_fire#Фея Алиса
item_fairy_fire_desc#Помогает вам в подземелье
item_fairy_target#Фея Скарлет
item_fairy_target_desc#Помогает вам в подземелье
item_robe_magician#Роба волшебника
item_robe_magician_desc#Увеличивает броню
item_gem_fire#Камень огня
item_gem_fire_desc#Атака огня (увеличенный урон)
item_ring_fire#Кольцо с рубином
item_ring_fire_desc#Увеличивает силу огня
item_manual_staff#Руководство к посоху
item_manual_staff_desc#Увеличивает дальность стрельбы
item_spell_teleport#Заклинание: Телепорт
item_spell_teleport_desc#Произнесите, чтобы телепортироваться в любое место комнаты
item_spell_slime_explode#Spell: Призыв слизня
item_spell_slime_explode_desc#Произнесите, чтобы призвать взрывного слизня
item_spell_fireball#Заклинание: Огненный шар
item_spell_fireball_desc#Произнесите, чтобы вызвать огненный шар
item_spell_freeze#Заклинание: Заморозка монстров
item_spell_freeze_desc#Произнесите, чтобы заморозить монстров
item_spell_earthquake#Заклинание: землетрясение
item_spell_earthquake_desc#Произнесите, чтобы сотрясти все подземелье
item_spell_protection#Заклинание: Магический щит
item_spell_protection_desc#Произнесите, чтобы призвать магический щит
spell_teleport#Телепорт
spell_slime_explode#Призвать слизня
spell_fireball#огненный шар
spell_freeze#заморозка монстров
spell_earthquake#землетрясение
spell_protection#магический щит
msg_level1_0#Ваше приключение началось!
msg_level1_1#"Ведьмы похитили дочь архимага и утащили ее в свое логово.
msg_level1_2#Мне нужно ее вернуть!"
msg_level2_0#Дочь архимага
msg_level2_1#"Я пришел чтобы спасти тебя!
msg_level2_2#Надеюсь, она жива..."
msg_level3_0#Дочь архимага
msg_level3_1#"Я когда-нибудь рассказывал тебе?
msg_level3_2#Дочь архимага - приятнейшая девушка во всей магической академии!"
msg_level4_0#Архимаг
msg_level4_1#"Архимаг - очень мудрый человек... А так же мой наставник.
msg_level4_2#Он показал мне, что мы живем в лучшем из миров."
msg_level5_0#Дочь архимага
msg_level5_1#"Я помню нас с дочерью архимага в магической академии.
msg_level5_2#Мы игрались с магией лечения, хи-хи !"
msg_level6_0#Архимаг
msg_level6_1#"Мои родители погибли, когда я был совсем крохой.
msg_level6_2#И архимаг растил меня как своего собственного сына."
msg_rats_bats_0#Монстры
msg_rats_bats_1#"Эй! Почему мы постоянно должны истреблять крыс и летучих мышей
msg_rats_bats_2#в рогаликах ?"
msg_snakes_0#Змеи
msg_snakes_1#"Я НЕНАВИЖУ ЗМЕЙ!"
msg_witches_0#Ведьмы
msg_witches_1#"Бл... Ведьмы !!!"
msg_gold_0#Золото
msg_gold_1#"♫ Money money money ♫
msg_gold_2#Я удивлюсь, если смогу купить хоть что-то полезное в этом подземелье..."
msg_familiar_0#Феи
msg_familiar_1#"Ох! Наконец-то я буду не один!
msg_familiar_2#Надеюсь, мне удастся найти больше союзников в этом подземелье."
msg_butcher_0#Свиночел-мясник
msg_butcher_1#"Эй, смотри какой здоровяк!
msg_butcher_2#Надеюсь, удастся порубить его на колбасу..."
msg_giant_slime_0#Гигантский слизень
msg_giant_slime_1#"Я зеленый, большой... И я воняю.
msg_giant_slime_2#Что же я такое?"
msg_cyclops_0#Каменный циклоп
msg_cyclops_1#"Как он прошел в комнату?
msg_cyclops_2#Он же гораздо больше двери!"
msg_wererat_0#Король веркрыс
msg_wererat_1#"Выглядит как моя старая тетка..."
msg_giant_spider_before_0#Пустая комната
msg_giant_spider_before_1#"Здесь есть кто-нибудь? "
msg_giant_spider_after_0#Гигантский паук
msg_giant_spider_after_1#"Я НЕНАВИЖУ ПАУКОВ"
msg_tuto_intro_0#Обучение: Основы
msg_tuto_intro_1#Используйте WASD (по умолчанию) для перемещения по подземелью.
msg_tuto_intro_2#Стреляйте клавишами со стрелочками (по умолчанию).
msg_tuto_items_0#Обучение: Предметы
msg_tuto_items_1#Предметы предоставляют вашему персонажу больше возможностей.
msg_tuto_items_2#Найдите или купите столько, сколько сможете.
msg_tuto_heal_0#Обучение: Здоровье
msg_tuto_heal_1#Вы потеряли немного очков здоровья.
msg_tuto_heal_2#Найдите способ вылечиться до того, как умрете.
msg_tuto_shops_0#Обучение: Магазины
msg_tuto_shops_1#Вы можете найти множество магазинов в подземелье.
msg_tuto_shops_2#В магазине вы сможете купить предметы или еду.
msg_tuto_boss_door_0#Обучение: Врата босса
msg_tuto_boss_door_1#Здесь вы видите закрытую золотую дверь.
msg_tuto_boss_door_2#За ней находится босс этого этажа, но вам нужен ключ, чтобы попасть внутрь.
msg_tuto_challenge_door_0#Обучение: Поле битвы
msg_tuto_challenge_door_1#Посмотрите на эту красивую дверь. За ней находится поле битвы
msg_tuto_challenge_door_2#Вы можете найти там ценную награду. Но входите с осторожностью!
msg_tuto_shots_0#Обучение: Типы выстрелов
msg_tuto_shots_1#Вы нашли новвое оружие.
msg_tuto_shots_2#Нажмите [выбор оружия] (по умолчанию: tab) чтобы переключаться между различными оружиями.
msg_tuto_spell_0#Обучение: Заклинания
msg_tuto_spell_1#Вы нашли магическое заклинание.
msg_tuto_spell_2#Нажмите на клавишу заклинания (по умолчанию: space) чтобы произнести его.
enemy_type_bat#летучей мышью
enemy_type_rat#крысой
enemy_type_rat_black#черной крысой
enemy_type_rat_helmet#крысой в шлеме
enemy_type_rat_black_helmet#черной крысой в шлеме
enemy_type_evil_flower#цветком зла
enemy_type_evil_flower_ice#эдельвейсом зла
enemy_type_snake#змеей
enemy_type_snake_blood#змеей крови
enemy_type_slime#слизнем
enemy_type_slime_red#красным слизнем
enemy_type_slime_blue#синим слизнем
enemy_type_slime_violet#фиолетовым слизнем
enemy_type_imp_blue#синим чертом
enemy_type_imp_red#красным чертом
enemy_type_pumpkin#сумасшедшей тыквой
enemy_type_witch#ведьмой
enemy_type_witch_red#красной ведьмой
enemy_type_cauldron#котлом
enemy_type_bubble#пузырем
enemy_type_boss_butcher#Свином-мясником
enemy_type_boss_slime_giant#Гигантским слизнем
enemy_type_boss_cyclops#каменным циклопом
enemy_type_boss_rat_king#Королем веркрысом
enemy_type_boss_spider_giant#Гигантским пауком
enemy_type_green_rat#зеленой крысой
enemy_type_rock_falling#падающим камнем
enemy_type_rock_missile#летящим камнем
enemy_type_spider_egg#упавшим паучьм яйцом
enemy_type_spider_little#пауком
enemy_type_spider_web#паучьей сетью
enemy_type_ghost#призраком
enemy_type_zombie#зомби
enemy_type_zombie_dark#темным зомби
enemy_type_francky#нечто
enemy_type_himself#по глупости
source_explosion#взрывом
source_poison#ядом
enemy_francky#Нечто
enemy_francky_head#Голова нечто
item_apple_green#Зеленое яблоко
item_apple_green_desc#Восстанавливает 3 HP и исцеляет яд
item_manual_slime#Руководство мастера слизней
item_manual_slime_desc#Слизни больше не охотятся на вас
item_spell_dual_quick#Книга быстрого двойного выстрела
item_spell_dual_quick_desc#Стреляет двумя снарядами (быстро)
item_spell_triple_quick#Книга быстрого тройного выстрела
item_spell_triple_quick_desc#Стреляет тремя снарядами (быстро)
item_manual_health#Руководство здоровья
item_manual_health_desc#Увеличенное лечение предметами
item_rear_shot#Наконечник для посоха
item_rear_shot_desc#Выстрел назад
item_book_random_shot#Книга случайного выстрела
item_book_random_shot_desc#Стреляет в случайном направлении
item_spell_web#Заклинание: Паучья сеть
item_spell_web_desc#Произнесите, чтобы метнуть паучьи сети
item_book_magic_i#Книга магии - Том первый
item_book_magic_i_desc#Уменьшает время восстановления заклинаний
item_book_magic_ii#Книга магии - Том второй
item_book_magic_ii_desc#Увеличивает силу заклинаний
item_sulfur#Сера
item_sulfur_desc#Позволяет взрывать трупы
spell_web#паучья сеть
tuto_reset#Сброс обучения
tuto_reset_desc#Сбрасывает обучение
msg_francky_0#Это.... Нечто...
msg_francky_1#Тьфу... Оно выглядит, слово сделано из нескольких трупов !
msg_tuto_tips_0#Обучение: Подсказки
msg_tuto_tips_1#Используйте управление временем (по умолчанию: RShift)
чтобы путешествовать быстрее.
msg_tuto_tips_2#Нажмите [Enter] чтобы немедленно закрыть окно сообщений.
menu_continue#Продолжить
menu_continue_desc#Продолжить игру
menu_save_quit#Сохранить и выйти
menu_save_quit_desc#Сохранить и вернуться в меню игры
menu_quit#Выход без сохранения
menu_quit_desc#Вернуться в главное меню без сохранения
inventory#Инвентарь
dc_certificate#Свидетельство о смерти
dc_killed_by#Убит
dc_died_level#Умер на уровне
dc_after#после
dc_minutes# минут игры
dc_killed_monsters#Убитые монстры
dc_gold#Золото
dc_challenges#Завершено битв
player_name#Имя игрока
player_name_desc#Изменить имя игрока
hi_scores#Зал славы
hi_scores_desc#Лучшие результаты
credits#Авторы
credits_desc#Список создателей
volume_sound#Громкость звука
volume_sound_desc#Используйте клавиши влево/вправо чтоы изменить громкость
volume_music#Громкость музыки
certificate_capture#Нажмите [F1] чтобы сохранить сертификат в PNG файл
certificate_saved#Сохранено в
msg_tuto_temple_0#Обучение: Храм
msg_tuto_temple_1#Храм - это место поклонения и пожертвования божеству.
msg_tuto_temple_2#Божества могут помочь вам предоставив дополнительную силу.
key_interact#взаимодействовать
interact_worship#Поклониться
interact_shop#Купить
interact_donate#Пожертвовать 10 золотых
interact_donate_fail#(не хватает золота)
worshipping#Теперь ваш покровитель
divinity_healer_0#Помоноса Праведная
divinity_healer_1#Защитница праведных и покровительница слабых.
divinity_healer_2#Она ценит пожертвования, страдания и борьбу со злом.
divinity_fighter_0#Телло Могущественный
divinity_fighter_1#Лорд сражающихся и сильных.
divinity_fighter_2#Он ценит монстров и титанов павших в битве.
divinity_ice_0#Мистер Снег
divinity_ice_1#Божество холода.
divinity_ice_2#Он ценит использование льда.
divinity_stone_0#Гайя
divinity_stone_1#Божество земли и камня.
divinity_stone_2#Он ценит использование камней.
divinity_intervention_0#Божественное вмешательство
divinity_intervention_1#вмешивается в вашу пользу.
divinity_gift_0#Божественный дар
divinity_gift_1#предоставляет вам дар.
item_floor_map#Карта подземелья
item_floor_map_desc#Открывает карту текущего этажа
item_alcohol#Абсент
item_alcohol_desc#временно увеличивает урон
\ No newline at end of file
diff --git a/media/items_equip.png b/media/items_equip.png
index ade05fb..90e55f4 100644
Binary files a/media/items_equip.png and b/media/items_equip.png differ
diff --git a/media/player_1.png b/media/player_1.png
index 446e900..0e99779 100644
Binary files a/media/player_1.png and b/media/player_1.png differ
diff --git a/src/ChestEntity.cpp b/src/ChestEntity.cpp
index e72db94..4c5ad0d 100644
--- a/src/ChestEntity.cpp
+++ b/src/ChestEntity.cpp
@@ -1,303 +1,303 @@
#include "ChestEntity.h"
#include "PlayerEntity.h"
#include "FallingRockEntity.h"
#include "ExplosionEntity.h"
#include "SnakeEntity.h"
#include "WitchBlastGame.h"
#include "sfml_game/ImageManager.h"
#include "sfml_game/SoundManager.h"
#include "sfml_game/SpriteEntity.h"
#include "Constants.h"
#include <iostream>
ChestEntity::ChestEntity(float x, float y, int chestType, bool isOpen)
: CollidingSpriteEntity(ImageManager::getInstance().getImage(IMAGE_CHEST), x, y, 48, 64)
{
type = ENTITY_CHEST;
imagesProLine = 2;
this->isOpen = isOpen;
this->chestType = chestType;
frame = chestType * imagesProLine;
//if (chestType > ChestFairy) frame = ChestFairy * imagesProLine;
frame += (isOpen ? 1 : 0);
if (isOpen && frame > ChestFairy * imagesProLine + 1) frame = ChestFairy * imagesProLine + 1;
setMap(game().getCurrentMap(), TILE_WIDTH, TILE_HEIGHT, 0, 0);
timer = -1.0f;
appearTimer = -1.0f;
sprite.setOrigin(24, 40);
}
bool ChestEntity::getOpened()
{
return isOpen;
}
int ChestEntity::getChestType()
{
return chestType;
}
void ChestEntity::makeAppear()
{
appearTimer = CHEST_APPEAR_DELAY;
for(int i=0; i < 8; i++)
{
generateStar(sf::Color(50, 50, 255, 255));
generateStar(sf::Color(255, 50, 50, 255));
generateStar(sf::Color(50, 255, 50, 255));
generateStar(sf::Color(255, 255, 255, 255));
}
}
void ChestEntity::animate(float delay)
{
if (appearTimer >= 0.0f) appearTimer -= delay;
CollidingSpriteEntity::animate(delay);
if (!isOpen) testSpriteCollisions();
z = y + 21;
// trap
if (timer > 0.0f)
{
timer -= delay;
if (timer <= 0.0f)
{
if (trap == TrapStones)
{
initFallingGrid();
for (int i = 0; i < 22; i++) fallRock();
SoundManager::getInstance().playSound(SOUND_TRAP);
game().makeShake(0.25f);
}
else if (trap == TrapExplosion)
{
initFallingGrid();
new ExplosionEntity(x, y, ExplosionTypeStandard, 12, EnemyTypeNone);
game().addCorpse(x, y, FRAME_CORPSE_SLIME_VIOLET);
SoundManager::getInstance().playSound(SOUND_BOOM_00);
game().makeShake(0.25f);
}
else // snakes
{
new SnakeEntity(x + 1, y, SnakeEntity::SnakeTypeNormal, true);
new SnakeEntity(x - 1, y, SnakeEntity::SnakeTypeNormal, true);
new SnakeEntity(x, y + 1, SnakeEntity::SnakeTypeNormal, true);
}
}
}
}
void ChestEntity::render(sf::RenderTarget* app)
{
if (appearTimer > 0.0f)
{
int fade = 255 * (1.0f - appearTimer / CHEST_APPEAR_DELAY);
sprite.setColor(sf::Color(255, 255, 255, fade));
}
else
sprite.setColor(sf::Color(255, 255, 255, 255));
CollidingSpriteEntity::render(app);
if (game().getShowLogical())
{
displayBoundingBox(app);
displayCenterAndZ(app);
}
}
void ChestEntity::calculateBB()
{
boundingBox.left = (int)x - width / 2;
boundingBox.width = width;
boundingBox.top = (int)y - 24;
boundingBox.height = 46;
}
void ChestEntity::readCollidingEntity(CollidingSpriteEntity* entity)
{
if (isOpen || appearTimer > 0.5f) return;
PlayerEntity* playerEntity = dynamic_cast<PlayerEntity*>(entity);
if (collideWithEntity(entity))
{
if (playerEntity != NULL && !playerEntity->isDead())
{
open();
frame += 1;
if (frame > ChestFairy * imagesProLine + 1) frame = ChestFairy * imagesProLine + 1;
}
}
}
void ChestEntity::dropItem(enumItemType item)
{
ItemEntity* newItem = new ItemEntity(item, x, y);
newItem->setVelocity(Vector2D(50.0f + rand()% 150));
if (newItem->getVelocity().y < 0.0f) newItem->setVelocity(Vector2D(newItem->getVelocity().x, -newItem->getVelocity().y));
newItem->setViscosity(0.96f);
}
void ChestEntity::open()
{
isOpen = true;
if (chestType >= ChestFairy)
SoundManager::getInstance().playSound(SOUND_GLASS);
else
SoundManager::getInstance().playSound(SOUND_CHEST_OPENING);
if (chestType == ChestBasic)
{
int r = rand()% 50;
if (r == 0 && !game().getPlayer()->isEquiped(EQUIP_FLOOR_MAP))
dropItem(ItemFloorMap);
else if (r == 1 && !game().getPlayer()->isEquiped(EQUIP_ALCOHOL))
dropItem(ItemAlcohol);
else if (r == 2 && !game().getPlayer()->isEquiped(EQUIP_LUCK))
dropItem(ItemLuck);
else if (r == 3 && !game().getPlayer()->isEquiped(EQUIP_FAIRY_POWDER) && game().getPlayer()->getFairieNumber() > 0)
dropItem(ItemFairyPowder);
else
{
// gold
int r = 2 + rand() % 6;
if (game().getPlayer()->isEquiped(EQUIP_LUCK)) r += rand() % 6;
for (int i = 0; i < r; i++)
{
ItemEntity* newItem = new ItemEntity(ItemCopperCoin, x, y);
newItem->setVelocity(Vector2D(50.0f + rand()% 150));
if (newItem->getVelocity().y < 0.0f) newItem->setVelocity(Vector2D(newItem->getVelocity().x, -newItem->getVelocity().y));
newItem->setViscosity(0.96f);
}
}
// trap !
- if (game().getLevel() >= 2)
+ if (game().getLevel() >= 2 && !game().getPlayer()->isEquiped(EQUIP_GLOVES_ADVANCED))
{
if (rand() % 6 == 0) // trap
{
int r = rand() % 3;
if (r == 0)
{
timer = 1.0f;
trap = TrapExplosion;
}
else if (r == 0)
{
timer = 1.0f;
- trap = TrapExplosion;
+ trap = TrapSnakes;
}
else
{
timer = 0.5f;
trap = TrapStones;
}
}
}
}
else if (chestType >= ChestFairy)
{
enumItemType itemType = ItemFairy;
switch (chestType - ChestFairy)
{
case FamiliarFairy: itemType = ItemFairy; break;
case FamiliarFairyIce: itemType = ItemFairyIce; break;
case FamiliarFairyFire: itemType = ItemFairyFire; break;
case FamiliarFairyTarget: itemType = ItemFairyTarget; break;
case FamiliarFairyPoison: itemType = ItemFairyPoison; break;
}
ItemEntity* newItem = new ItemEntity(itemType, x, y);
newItem->setVelocity(Vector2D(50.0f + rand()% 150));
newItem->setViscosity(0.96f);
}
else if (chestType == ChestExit)
{
int r = rand() % 3;
if (r == 0)
{
for (int i = 0; i < 5; i++)
{
ItemEntity* newItem = new ItemEntity(ItemSilverCoin, x, y);
newItem->setVelocity(Vector2D(90.0f + rand()% 150));
if (newItem->getVelocity().y < 0.0f) newItem->setVelocity(Vector2D(newItem->getVelocity().x, -newItem->getVelocity().y));
newItem->setViscosity(0.96f);
}
}
else if (r == 1)
{
for (int i = 0; i < 3; i++)
{
ItemEntity* newItem = new ItemEntity(ItemSilverCoin, x, y);
newItem->setVelocity(Vector2D(90.0f + rand()% 150));
if (newItem->getVelocity().y < 0.0f) newItem->setVelocity(Vector2D(newItem->getVelocity().x, -newItem->getVelocity().y));
newItem->setViscosity(0.96f);
}
ItemEntity* newItem = new ItemEntity(ItemHealth, x, y);
newItem->setVelocity(Vector2D(90.0f + rand()% 150));
if (newItem->getVelocity().y < 0.0f) newItem->setVelocity(Vector2D(newItem->getVelocity().x, -newItem->getVelocity().y));
newItem->setViscosity(0.96f);
}
else
{
int bonusType = game().getRandomEquipItem(false, true);
ItemEntity* newItem;
if (game().getPlayer()->isEquiped(bonusType))
newItem = new ItemEntity( (enumItemType)(ItemBonusHealth), x ,y);
else
newItem = new ItemEntity( (enumItemType)(FirstEquipItem + bonusType), x ,y);
newItem->setVelocity(Vector2D(160.0f + rand()% 80));
if (newItem->getVelocity().y < 0.0f) newItem->setVelocity(Vector2D(newItem->getVelocity().x, -newItem->getVelocity().y));
newItem->setViscosity(0.96f);
}
}
else if (chestType == ChestChallenge)
{
game().generateChallengeBonus(x, y);
}
}
void ChestEntity::initFallingGrid()
{
for (int i = 0; i < MAP_WIDTH; i++)
for (int j = 0; j < MAP_HEIGHT; j++)
fallingGrid[i][j] = false;
}
void ChestEntity::fallRock()
{
int rx, ry;
do
{
rx = 1 + rand() % (MAP_WIDTH - 2);
ry = 1 + rand() % (MAP_HEIGHT - 2);
}
while (fallingGrid[rx][ry]);
fallingGrid[rx][ry] = true;
new FallingRockEntity(rx * TILE_WIDTH + TILE_WIDTH / 2,
ry * TILE_HEIGHT + TILE_HEIGHT / 2,
rand() % 3,
true);
}
void ChestEntity::generateStar(sf::Color starColor)
{
SpriteEntity* spriteStar = new SpriteEntity(
ImageManager::getInstance().getImage(IMAGE_STAR_2),
x - 15 + rand() % 30, y - 10 + rand() % 30);
spriteStar->setScale(0.8f, 0.8f);
spriteStar->setZ(1000.0f);
spriteStar->setSpin(-100 + rand()%200);
spriteStar->setVelocity(Vector2D(50 + rand()%40));
spriteStar->setWeight(-130);
spriteStar->setFading(true);
spriteStar->setAge(-0.8f);
spriteStar->setLifetime(0.2f + (rand() % 100) * 0.005f );
spriteStar->setColor(starColor);
spriteStar->setType(ENTITY_EFFECT);
spriteStar->setRenderAdd();
}
diff --git a/src/ItemEntity.cpp b/src/ItemEntity.cpp
index e8f2bd2..f826f51 100644
--- a/src/ItemEntity.cpp
+++ b/src/ItemEntity.cpp
@@ -1,304 +1,304 @@
#include "ItemEntity.h"
#include "sfml_game/ImageManager.h"
#include "sfml_game/SoundManager.h"
#include "sfml_game/SpriteEntity.h"
#include "Constants.h"
#include "MagnetEntity.h"
#include "WitchBlastGame.h"
#include <iostream>
#include <sstream>
ItemEntity::ItemEntity(enumItemType itemType, float x, float y)
: CollidingSpriteEntity(ImageManager::getInstance().getImage(itemType >= FirstEquipItem ? IMAGE_ITEMS_EQUIP : IMAGE_ITEMS), x, y, ITEM_WIDTH, ITEM_HEIGHT)
{
type = ENTITY_ITEM;
this->itemType = itemType;
frame = itemType;
if (itemType >= FirstEquipItem) frame = itemType - FirstEquipItem;
isMerchandise = false;
imagesProLine = 10;
setMap(game().getCurrentMap(), TILE_WIDTH, TILE_HEIGHT, 0, 0);
isBeating = false;
isFlying = false;
jumpTimer = 1.0f + 0.1f * (rand() % 40);
h = -1.0f;
}
void ItemEntity::setMerchandise(bool isMerchandise)
{
this->isMerchandise = isMerchandise;
}
bool ItemEntity::getMerchandise()
{
return isMerchandise;
}
int ItemEntity::getPrice()
{
return (items[itemType].price);
}
bool ItemEntity::canBePickedUp()
{
// don't use health item if you don't need it
if (game().getPlayer()->getHp() == game().getPlayer()->getHpMax())
if (itemType >= ItemHealthVerySmall && itemType <= ItemHealthVerySmallPoison) return false;
if (isMerchandise == true && game().getPlayer()->getGold() < getPrice()) return false;
if (itemType == ItemBossHeart && !game().getCurrentMap()->isCleared()) return false;
if (itemType >= FirstEquipItem)
if (game().getPlayer()->isEquiped(itemType - FirstEquipItem)) return false;
if (items[itemType].spell != SpellNone && game().getPlayer()->getFairyTransmuted()) return false;
if (itemType == ItemBookDualShots || itemType == ItemBookTripleShots)
if (game().getPlayer()->isEquiped(EQUIP_BOOK_DUAL_QUICK)
|| game().getPlayer()->isEquiped(EQUIP_BOOK_TRIPLE_QUICK)
|| game().getPlayer()->isEquiped(EQUIP_RAPID_SHOT)) return false;
if (itemType == ItemBookDualShotsQuick || itemType == ItemBookTripleShotsQuick)
if (game().getPlayer()->isEquiped(EQUIP_BOOK_DUAL)
|| game().getPlayer()->isEquiped(EQUIP_BOOK_TRIPLE)
|| game().getPlayer()->isEquiped(EQUIP_RAPID_SHOT)) return false;
if (itemType == ItemBookRapidShots)
if (game().getPlayer()->isEquiped(EQUIP_BOOK_DUAL)
|| game().getPlayer()->isEquiped(EQUIP_BOOK_TRIPLE)
|| game().getPlayer()->isEquiped(EQUIP_BOOK_DUAL_QUICK)
|| game().getPlayer()->isEquiped(EQUIP_BOOK_TRIPLE_QUICK)) return false;
return true;
}
bool ItemEntity::isOnMap()
{
if (x < 0) return false;
if (x > TILE_WIDTH * MAP_WIDTH) return false;
if (y < 0) return false;
if (y > TILE_HEIGHT * MAP_HEIGHT) return false;
return true;
}
void ItemEntity::animate(float delay)
{
if (isMerchandise)
{
testSpriteCollisions();
return;
}
if (isFlying)
{
if (!isCollidingWithMap() && isOnMap())
{
isFlying = false;
viscosity = 0.96f;
}
else
{
if (velocity.x < -10 || velocity.x > 10 || velocity.y < -10 || velocity.y > 10) // moving
{
// stay in the map
if (velocity.x < 40 && x < TILE_WIDTH) velocity.x = 220.0f;
else if (velocity.x > -40 && x > (TILE_WIDTH - 1) * MAP_WIDTH) velocity.x = -220.0f;
if (velocity.y < 40 && y < TILE_HEIGHT) velocity.y = 220.0f;
else if (velocity.y > -40 && y > (TILE_HEIGHT - 1) * MAP_HEIGHT) velocity.y = -220.0f;
}
else // not moving
{
setVelocity(Vector2D(100.0f + rand()% 250));
}
// make move
x += velocity.x * delay;
y += velocity.y * delay;
age += delay;
}
}
else // not flying
{
if (isCollidingWithMap() || !isOnMap())
{
isFlying = true;
}
else
{
CollidingSpriteEntity::animate(delay);
if (canBePickedUp() && !isMerchandise)
{
jumpTimer -= delay;
if (jumpTimer <= 0.0f)
{
jumpTimer = 2.0f + 0.1f * (rand() % 40);
h = 0.1f;
hVelocity = 150.0f;
}
}
}
}
if (h > 0.0f)
{
h += hVelocity * delay;
hVelocity -= 1200.0f * delay;
}
if (age > 0.7f) testSpriteCollisions();
if (isBeating)
{
timer -= delay;
if (timer <= 0.0f)
{
timer = HEART_BEAT_DELAY;
SoundManager::getInstance().playSound(SOUND_HEART);
}
float sc;
if (timer > HEART_BEAT_DELAY - 0.25f)
{
sc = timer - HEART_BEAT_DELAY + 1.25f;
}
else
sc = 1.0f;
sprite.setScale(sc, sc);
}
if (itemType == ItemBossHeart && !isBeating && game().getCurrentMap()->isCleared())
{
// start beating
isBeating = true;
timer = HEART_BEAT_DELAY;
}
z = y + height / 2;
}
void ItemEntity::render(sf::RenderTarget* app)
{
// shadow
if (itemType < FirstEquipItem)
{
sprite.setTextureRect(sf::IntRect(9 * width, height, width, height));
sprite.setPosition(x, y + 3);
app->draw(sprite);
sprite.setPosition(x, y);
}
else
{
- sprite.setTextureRect(sf::IntRect(9 * width, 5 * height, width, height));
+ sprite.setTextureRect(sf::IntRect(9 * width, 6 * height, width, height));
app->draw(sprite);
}
// price
if (isMerchandise)
{
std::ostringstream oss;
oss << getPrice();
sf::Color fontColor;
if (getPrice() > game().getPlayer()->getGold()) fontColor = sf::Color(215, 20, 20);
else fontColor = sf::Color(255, 255, 255);
game().write(oss.str(), 16, x, y + 35.0f, ALIGN_CENTER, fontColor, app, 1 , 1);
}
if (h > 0.1f)
{
sprite.setTextureRect(sf::IntRect(frame % imagesProLine * width, frame / imagesProLine * height, width, height));
sprite.setPosition(x, y - h);
app->draw(sprite);
sprite.setPosition(x, y);
}
else
CollidingSpriteEntity::render(app);
if (game().getShowLogical())
{
displayBoundingBox(app);
displayCenterAndZ(app);
}
}
void ItemEntity::calculateBB()
{
if (isMerchandise)
{
boundingBox.left = (int)x - width / 4;
boundingBox.width = width / 2;
boundingBox.top = (int)y - height / 2 - 20;
boundingBox.height = height + 100;
}
else
{
boundingBox.left = (int)x - width / 2;
boundingBox.width = width;
boundingBox.top = (int)y - height / 2;
boundingBox.height = height;
}
}
void ItemEntity::dying()
{
isDying = true;
}
void ItemEntity::buy()
{
if (canBePickedUp() && isMerchandise)
{
game().getPlayer()->acquireItem(itemType);
game().getPlayer()->pay(getPrice());
game().getPlayer()->setItemToBuy(NULL);
dying();
if (!items[itemType].generatesStance)
new MagnetEntity(x, y, game().getPlayer(), itemType);
}
}
void ItemEntity::readCollidingEntity(CollidingSpriteEntity* entity)
{
if (itemType == ItemBossHeart && !game().getCurrentMap()->isCleared()) return;
PlayerEntity* playerEntity = dynamic_cast<PlayerEntity*>(entity);
if (collideWithEntity(entity))
{
if (playerEntity != NULL && !playerEntity->isDead())
{
if (isMerchandise)
{
playerEntity->setItemToBuy(this);
}
else if (canBePickedUp())
{
playerEntity->acquireItem(itemType);
if (isMerchandise) playerEntity->pay(getPrice());
dying();
if (!items[itemType].generatesStance)
new MagnetEntity(x, y, playerEntity, itemType);
}
}
}
}
void ItemEntity::collideMapRight()
{
velocity.x = -velocity.x * 0.66f;
}
void ItemEntity::collideMapLeft()
{
velocity.x = -velocity.x * 0.66f;
}
void ItemEntity::collideMapTop()
{
velocity.y = -velocity.y * 0.66f;
}
void ItemEntity::collideMapBottom()
{
velocity.y = -velocity.y * 0.66f;
}
diff --git a/src/Items.h b/src/Items.h
index 5683b10..20e6266 100644
--- a/src/Items.h
+++ b/src/Items.h
@@ -1,586 +1,600 @@
#ifndef ITEMS_H
#define ITEMS_H
#include "Constants.h"
const int SPECIAL_SHOT_SLOTS_STANDARD = 2;
const int SPECIAL_SHOT_SLOTS_ADVANCED = 2;
const int SPECIAL_SHOT_SLOTS = 1 + SPECIAL_SHOT_SLOTS_STANDARD + SPECIAL_SHOT_SLOTS_ADVANCED;
/** Rarity enum
* Rarity of the equipment.
*/
enum enumRarity
{
RarityCommon, /**< Common */
RarityUncommon, /**< Uncommon */
RarityRare /**< Rare */
};
/** Familiar enum
* Familiars.
*/
enum enumFamiliar
{
FamiliarNone = -1, /**< No familiar */
FamiliarFairy, /**< Standard Fairy */
FamiliarFairyTarget, /**< Target Fairy */
FamiliarFairyFire, /**< Fire Fairy */
FamiliarFairyIce, /**< Ice Fairy */
FamiliarFairyPoison, /**< Poison Fairy */
};
// spells
enum enumCastSpell
{
SpellTeleport,
SpellSlimeExplode,
SpellFireball,
SpellFreeze,
SpellEarthquake,
SpellProtection,
SpellWeb,
SpellFlower,
SpellFairy,
SpellNone
};
const int SPELL_MAX = SpellNone;
const std::string spellLabel[SpellNone] =
{
"spell_teleport",
"spell_slime_explode",
"spell_fireball",
"spell_freeze",
"spell_earthquake",
"spell_protection",
"spell_web",
"spell_flower",
"spell_fairy"
};
/** Item type enum
* All the items and equipments.
*/
enum enumItemType
{
ItemCopperCoin,
ItemSilverCoin,
ItemGoldCoin,
ItemBossHeart,
ItemBonusHealth,
ItemHealthVerySmall,
ItemHealthSmall,
ItemHealth,
ItemHealthVerySmallPoison,
ItemMagicianHat, // first equip item
ItemLeatherBoots,
ItemBookDualShots,
ItemRageAmulet,
ItemBossKey,
ItemDisplacementGloves,
ItemMahoganyStaff,
ItemFairy,
ItemLeatherBelt,
ItemBloodSnake,
ItemGemIce,
ItemGemIllusion,
ItemGemStone,
ItemGemLightning,
ItemFairyTarget,
ItemRingIce,
ItemRingStone,
ItemRingLightning,
ItemRingIllusion,
ItemBookTripleShots,
ItemCriticalAdvanced,
ItemFairyFire,
ItemFairyIce,
ItemMagicianRobe,
ItemGemFire,
ItemRingFire,
ItemManualStaff,
ItemSpellTeleport,
ItemSpellSlimeExplode,
ItemSpellFireball,
ItemSpellFreeze,
ItemSpellEarthquake,
ItemSpellProtection,
ItemManualSlime,
ItemBookDualShotsQuick,
ItemBookTripleShotsQuick,
ItemManualHealth,
ItemRearShot,
ItemBookRandomShot,
ItemSpellWeb,
ItemBookMagicI,
ItemBookMagicII,
ItemSulfur,
ItemFloorMap,
ItemAlcohol,
ItemLuck,
ItemFairyPowder,
ItemBookRapidShots,
ItemGemPoison,
ItemSpellFlower,
ItemFairyPoison,
ItemRingPoison,
ItemBookPrayerI,
ItemBookPrayerII,
ItemPetSlime,
ItemHatAdvanced,
ItemRobeAdvanced,
ItemCritical,
ItemSpellFairy,
+ ItemGlovesAdvanced,
+ ItemBootsAdvanced,
NUMBER_ITEMS
};
const int FirstEquipItem = (int) ItemMagicianHat; /*!< Used as an offset when creating items */
/*!
* \brief Item structure
*
* Contains all the data for an item.
*/
struct itemStuct
{
enumItemType type; /**< The item ID */
std::string name; /**< The item name */
std::string description; /**< The item description */
int price; /**< The item price (for shops) */
bool equip; /**< True if the item is an equipment */
enumFamiliar familiar; /**< True if the "item" is a familiar */
bool canBeSold; /**< True if the item is can be sold */
bool canBeFound; /**< True if the item is can be found */
bool generatesStance; /**< True if picking the item generates an acquiring stance*/
int level; /**< Minimal level where the item can be found */
enumRarity rarity; /**< Item rarity */
bool isFloorItem; /**< Floor item */
int requirement; /**< Pre-requisite item */
enumShotType specialShot; /**< Special shot */
enumCastSpell spell; /**< Spell */
};
/** Array with all the items and data */
const itemStuct items[NUMBER_ITEMS] =
{
{
ItemCopperCoin, "item_copper", "item_copper_desc",
1, false, FamiliarNone, false, false, false, 1, RarityCommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemSilverCoin, "item_silver", "item_silver_desc",
5, false, FamiliarNone, false, false, false, 1, RarityCommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemGoldCoin, "item_gold", "item_gold_desc",
20, false, FamiliarNone, false, false, false, 1, RarityCommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemBossHeart, "item_titan_heart", "item_titan_heart_desc",
250, false, FamiliarNone, false, false, true, 1, RarityCommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemBonusHealth, "item_elven_cookie", "item_elven_cookie_desc",
250, false, FamiliarNone, false, false, true, 1, RarityCommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemHealthVerySmall, "item_apple", "item_apple_desc",
2, false, FamiliarNone, true, false, false, 1, RarityCommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemHealthSmall, "item_bread", "item_bread_desc",
4, false, FamiliarNone, true, false, false, 1, RarityCommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemHealthSmall, "item_cheese", "item_cheese_desc",
8, false, FamiliarNone, true, false, false, 1, RarityCommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemHealthVerySmallPoison, "item_apple_green", "item_apple_green_desc",
2, false, FamiliarNone, true, false, false, 1, RarityCommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemMagicianHat, "item_sorcerer_hat", "item_sorcerer_hat_desc",
20, true, FamiliarNone, true, true, true, 1, RarityCommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemLeatherBoots, "item_velvet_boots", "item_velvet_boots_desc",
20, true, FamiliarNone, true, true, true, 1, RarityCommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemBookDualShots, "item_spell_dual", "item_spell_dual_desc",
20, true, FamiliarNone, true, true, true, 1, RarityRare, false, -1, ShotTypeStandard, SpellNone
},
{
ItemRageAmulet, "item_rage_amulet", "item_rage_amulet_desc",
20, true, FamiliarNone, true, true, true, 1, RarityCommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemBossKey, "item_boss_key", "item_boss_key_desc",
10, true, FamiliarNone, false, false, true, 1, RarityCommon, true, -1, ShotTypeStandard, SpellNone
},
{
ItemDisplacementGloves, "item_displacement_gloves", "item_displacement_gloves_desc",
20, true, FamiliarNone, true, true, true, 1, RarityCommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemMahoganyStaff, "item_staff", "item_staff_desc",
25, true, FamiliarNone, true, true, true, 2, RarityCommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemFairy, "item_fairy", "item_fairy_desc",
20, true, FamiliarFairy, false, true, true, 1, RarityCommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemLeatherBelt, "item_leather_belt", "item_leather_belt_desc",
20, true, FamiliarNone, true, true, true, 1, RarityCommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemBloodSnake, "item_blood_snake", "item_blood_snake_desc",
20, true, FamiliarNone, true, true, true, 1, RarityUncommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemGemIce, "item_gem_ice", "item_gem_ice_desc",
25, true, FamiliarNone, true, true, true, 2, RarityCommon, false, -1, ShotTypeIce, SpellNone
},
{
ItemGemIllusion, "item_gem_illusion", "item_gem_illusion_desc",
30, true, FamiliarNone, true, true, true, 4, RarityUncommon, false, -1, ShotTypeIllusion, SpellNone
},
{
ItemGemStone, "item_gem_stone", "item_gem_stone_desc",
25, true, FamiliarNone, true, true, true, 2, RarityCommon, false, -1, ShotTypeStone, SpellNone
},
{
ItemGemLightning, "item_gem_lightning", "item_gem_lightning_desc",
25, true, FamiliarNone, true, true, true, 2, RarityCommon, false, -1, ShotTypeLightning, SpellNone
},
{
ItemFairyTarget, "item_fairy_target", "item_fairy_target_desc",
40, true, FamiliarFairyTarget, false, true, true, 2, RarityUncommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemRingIce, "item_ring_ice", "item_ring_ice_desc",
45, true, FamiliarNone, true, true, true, 3, RarityUncommon, false, ItemGemIce, ShotTypeStandard, SpellNone
},
{
ItemRingStone, "item_ring_stone", "item_ring_stone_desc",
45, true, FamiliarNone, true, true, true, 3, RarityUncommon, false, ItemGemStone, ShotTypeStandard, SpellNone
},
{
ItemRingLightning, "item_ring_lightning", "item_ring_lightning_desc",
45, true, FamiliarNone, true, true, true, 3, RarityUncommon, false, ItemGemLightning, ShotTypeStandard, SpellNone
},
{
ItemRingIllusion, "item_ring_illusion", "item_ring_illusion_desc",
50, true, FamiliarNone, true, true, true, 4, RarityUncommon, false, ItemGemIllusion, ShotTypeStandard, SpellNone
},
{
ItemBookTripleShots, "item_spell_triple", "item_spell_triple_desc",
50, true, FamiliarNone, true, true, true, 4, RarityCommon, false, ItemBookDualShots, ShotTypeStandard, SpellNone
},
{
ItemCriticalAdvanced, "item_critical_advanced", "item_critical_advanced_desc",
35, true, FamiliarNone, true, true, true, 1, RarityCommon, false, ItemCritical, ShotTypeStandard, SpellNone
},
{
ItemFairyFire, "item_fairy_fire", "item_fairy_fire_desc",
30, true, FamiliarFairyFire, false, true, true, 2, RarityUncommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemFairyIce, "item_fairy_ice", "item_fairy_ice_desc",
30, true, FamiliarFairyIce, false, true, true, 2, RarityUncommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemMagicianRobe, "item_robe_magician", "item_robe_magician_desc",
25, true, FamiliarNone, true, true, true, 1, RarityCommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemGemFire, "item_gem_fire", "item_gem_fire_desc",
30, true, FamiliarNone, true, true, true, 4, RarityUncommon, false, -1, ShotTypeFire, SpellNone
},
{
ItemRingFire, "item_ring_fire", "item_ring_fire_desc",
50, true, FamiliarNone, true, true, true, 4, RarityUncommon, false, ItemGemFire, ShotTypeStandard, SpellNone
},
{
ItemManualStaff, "item_manual_staff", "item_manual_staff_desc",
20, true, FamiliarNone, true, true, true, 1, RarityCommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemSpellTeleport, "item_spell_teleport", "item_spell_teleport_desc",
60, true, FamiliarNone, false, false, true, 1, RarityCommon, false, -1, ShotTypeStandard, SpellTeleport
},
{
ItemSpellSlimeExplode, "item_spell_slime_explode", "item_spell_slime_explode_desc",
60, true, FamiliarNone, false, false, true, 1, RarityCommon, false, -1, ShotTypeStandard, SpellSlimeExplode
},
{
ItemSpellFireball, "item_spell_fireball", "item_spell_fireball_desc",
60, true, FamiliarNone, false, false, true, 1, RarityCommon, false, -1, ShotTypeStandard, SpellFireball
},
{
ItemSpellFreeze, "item_spell_freeze", "item_spell_freeze_desc",
60, true, FamiliarNone, false, false, true, 1, RarityCommon, false, -1, ShotTypeStandard, SpellFreeze
},
{
ItemSpellEarthquake, "item_spell_earthquake", "item_spell_earthquake_desc",
60, true, FamiliarNone, false, false, true, 1, RarityCommon, false, -1, ShotTypeStandard, SpellEarthquake
},
{
ItemSpellProtection, "item_spell_protection", "item_spell_protection_desc",
60, true, FamiliarNone, false, false, true, 1, RarityCommon, false, -1, ShotTypeStandard, SpellProtection
},
{
ItemManualSlime, "item_manual_slime", "item_manual_slime_desc",
30, true, FamiliarNone, true, true, true, 3, RarityUncommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemBookDualShotsQuick, "item_spell_dual_quick", "item_spell_dual_quick_desc",
20, true, FamiliarNone, true, true, true, 1, RarityRare, false, -1, ShotTypeStandard, SpellNone
},
{
ItemBookTripleShotsQuick, "item_spell_triple_quick", "item_spell_triple_quick_desc",
50, true, FamiliarNone, true, true, true, 4, RarityCommon, false, ItemBookDualShotsQuick, ShotTypeStandard, SpellNone
},
{
ItemManualHealth, "item_manual_health", "item_manual_health_desc",
20, true, FamiliarNone, true, true, true, 2, RarityCommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemRearShot, "item_rear_shot", "item_rear_shot_desc",
20, true, FamiliarNone, true, true, true, 1, RarityUncommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemBookRandomShot, "item_book_random_shot", "item_book_random_shot_desc",
20, true, FamiliarNone, true, true, true, 1, RarityUncommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemSpellWeb, "item_spell_web", "item_spell_web_desc",
60, true, FamiliarNone, false, false, true, 1, RarityCommon, false, -1, ShotTypeStandard, SpellWeb
},
{
ItemBookMagicI, "item_book_magic_i", "item_book_magic_i_desc",
35, true, FamiliarNone, true, true, true, 4, RarityRare, false, -1, ShotTypeStandard, SpellNone
},
{
ItemBookMagicII, "item_book_magic_ii", "item_book_magic_ii_desc",
35, true, FamiliarNone, true, true, true, 4, RarityRare, false, -1, ShotTypeStandard, SpellNone
},
{
ItemSulfur, "item_sulfur", "item_sulfur_desc",
35, true, FamiliarNone, true, true, true, 2, RarityRare, false, -1, ShotTypeStandard, SpellNone
},
{
ItemFloorMap, "item_floor_map", "item_floor_map_desc",
10, true, FamiliarNone, false, false, true, 1, RarityCommon, true, -1, ShotTypeStandard, SpellNone
},
{
ItemAlcohol, "item_alcohol", "item_alcohol_desc",
10, true, FamiliarNone, false, false, true, 1, RarityCommon, true, -1, ShotTypeStandard, SpellNone
},
{
ItemLuck, "item_luck", "item_luck_desc",
10, true, FamiliarNone, false, false, true, 1, RarityCommon, true, -1, ShotTypeStandard, SpellNone
},
{
ItemFairyPowder, "item_fairy_powder", "item_fairy_powder_desc",
10, true, FamiliarNone, false, false, true, 1, RarityCommon, true, -1, ShotTypeStandard, SpellNone
},
{
ItemBookRapidShots, "item_rapid_shots", "item_rapid_shots_desc",
20, true, FamiliarNone, true, true, true, 1, RarityRare, false, -1, ShotTypeStandard, SpellNone
},
{
ItemGemPoison, "item_gem_poison", "item_gem_poison_desc",
30, true, FamiliarNone, true, true, true, 4, RarityUncommon, false, -1, ShotTypePoison, SpellNone
},
{
ItemSpellFlower, "item_spell_flower", "item_spell_flower_desc",
60, true, FamiliarNone, false, false, true, 1, RarityCommon, false, -1, ShotTypeStandard, SpellFlower
},
{
ItemFairyPoison, "item_fairy_poison", "item_fairy_poison_desc",
30, true, FamiliarFairyPoison, false, true, true, 2, RarityUncommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemRingPoison, "item_ring_poison", "item_ring_poison_desc",
50, true, FamiliarNone, true, true, true, 4, RarityUncommon, false, ItemGemPoison, ShotTypeStandard, SpellNone
},
{
ItemBookPrayerI, "item_book_prayer_i", "item_book_prayer_i_desc",
35, true, FamiliarNone, true, true, true, 3, RarityRare, false, -1, ShotTypeStandard, SpellNone
},
{
ItemBookPrayerII, "item_book_prayer_ii", "item_book_prayer_ii_desc",
35, true, FamiliarNone, true, true, true, 3, RarityRare, false, -1, ShotTypeStandard, SpellNone
},
{
ItemPetSlime, "item_pet_slime", "item_pet_slime_desc",
50, true, FamiliarNone, true, true, true, 1, RarityRare, false, -1, ShotTypeStandard, SpellNone
},
{
ItemHatAdvanced, "item_hat_advanced", "item_hat_advanced_desc",
35, true, FamiliarNone, true, true, true, 2, RarityCommon, false, ItemMagicianHat, ShotTypeStandard, SpellNone
},
{
ItemRobeAdvanced, "item_robe_advanced", "item_robe_advanced_desc",
40, true, FamiliarNone, true, true, true, 3, RarityCommon, false, ItemMagicianRobe, ShotTypeStandard, SpellNone
},
{
ItemCritical, "item_critical", "item_critical_desc",
20, true, FamiliarNone, true, true, true, 1, RarityCommon, false, -1, ShotTypeStandard, SpellNone
},
{
ItemSpellFairy, "item_spell_fairy", "item_spell_fairy_desc",
60, true, FamiliarNone, false, false, true, 1, RarityCommon, false, -1, ShotTypeStandard, SpellFairy
},
+ {
+ ItemGlovesAdvanced, "item_gloves_advanced", "item_gloves_advanced_desc",
+ 35, true, FamiliarNone, true, true, true, 2, RarityCommon, false, ItemDisplacementGloves, ShotTypeStandard, SpellNone
+ },
+ {
+ ItemBootsAdvanced, "item_boots_advanced", "item_boots_advanced_desc",
+ 35, true, FamiliarNone, true, true, true, 2, RarityCommon, false, ItemLeatherBoots, ShotTypeStandard, SpellNone
+ },
};
/** Item equipment type enum
* All the equipments.
*/
enum item_equip_enum {
EQUIP_MAGICIAN_HAT,
EQUIP_LEATHER_BOOTS,
EQUIP_BOOK_DUAL,
EQUIP_RAGE_AMULET,
EQUIP_BOSS_KEY,
EQUIP_DISPLACEMENT_GLOVES,
EQUIP_MAHOGANY_STAFF,
EQUIP_FAIRY,
EQUIP_LEATHER_BELT,
EQUIP_BLOOD_SNAKE,
EQUIP_GEM_ICE,
EQUIP_GEM_ILLUSION,
EQUIP_GEM_STONE,
EQUIP_GEM_LIGHTNING,
EQUIP_FAIRY_ICE,
EQUIP_RING_ICE,
EQUIP_RING_STONE,
EQUIP_RING_LIGHTNING,
EQUIP_RING_ILLUSION,
EQUIP_BOOK_TRIPLE,
EQUIP_CRITICAL_ADVANCED,
EQUIP_FAIRY_FIRE,
EQUIP_FAIRY_TARGET,
EQUIP_MAGICIAN_ROBE,
EQUIP_GEM_FIRE,
EQUIP_RING_FIRE,
EQUIP_MANUAL_STAFF,
EQUIP_SPELL_TELEPORT,
EQUIP_SPELL_SLIME_EXPLODE,
EQUIP_SPELL_FIREBALL,
EQUIP_SPELL_FREEZE,
EQUIP_SPELL_EARTHQUAKE,
EQUIP_SPELL_PROTECTION,
EQUIP_MANUAL_SLIMES,
EQUIP_BOOK_DUAL_QUICK,
EQUIP_BOOK_TRIPLE_QUICK,
EQUIP_MANUAL_HEALTH,
EQUIP_REAR_SHOT,
EQUIP_BOOK_RANDOM,
EQUIP_SPELL_WEB,
EQUIP_BOOK_MAGIC_I,
EQUIP_BOOK_MAGIC_II,
EQUIP_SULFUR,
EQUIP_FLOOR_MAP,
EQUIP_ALCOHOL,
EQUIP_LUCK,
EQUIP_FAIRY_POWDER,
EQUIP_RAPID_SHOT,
EQUIP_GEM_POISON,
EQUIP_SPELL_FLOWER,
EQUIP_FAIRY_POISON,
EQUIP_RING_POISON,
EQUIP_BOOK_PRAYER_I,
EQUIP_BOOK_PRAYER_II,
EQUIP_PET_SLIME,
EQUIP_HAT_ADVANCED,
EQUIP_ROBE_ADVANCED,
EQUIP_CRITICAL,
EQUIP_SPELL_FAIRY,
+ EQUIP_GLOVES_ADVANCED,
+ EQUIP_BOOTS_ADVANCED,
NUMBER_EQUIP_ITEMS
};
const std::vector<item_equip_enum> sortedEquipement =
{
// clothes
EQUIP_MAGICIAN_ROBE,
EQUIP_ROBE_ADVANCED,
EQUIP_MAGICIAN_HAT,
EQUIP_HAT_ADVANCED,
EQUIP_LEATHER_BOOTS,
+ EQUIP_BOOTS_ADVANCED,
EQUIP_DISPLACEMENT_GLOVES,
+ EQUIP_GLOVES_ADVANCED,
EQUIP_LEATHER_BELT,
EQUIP_RAGE_AMULET,
EQUIP_CRITICAL,
EQUIP_CRITICAL_ADVANCED,
EQUIP_RING_ICE,
EQUIP_RING_STONE,
EQUIP_RING_LIGHTNING,
EQUIP_RING_FIRE,
EQUIP_RING_ILLUSION,
EQUIP_RING_POISON,
// weapons
EQUIP_MAHOGANY_STAFF,
EQUIP_BLOOD_SNAKE,
EQUIP_REAR_SHOT,
EQUIP_SULFUR,
EQUIP_GEM_ICE,
EQUIP_GEM_STONE,
EQUIP_GEM_LIGHTNING,
EQUIP_GEM_FIRE,
EQUIP_GEM_ILLUSION,
EQUIP_GEM_POISON,
// books
EQUIP_MANUAL_STAFF,
EQUIP_MANUAL_SLIMES,
EQUIP_MANUAL_HEALTH,
EQUIP_BOOK_RANDOM,
EQUIP_BOOK_MAGIC_I,
EQUIP_BOOK_MAGIC_II,
EQUIP_BOOK_PRAYER_I,
EQUIP_BOOK_PRAYER_II,
EQUIP_BOOK_DUAL,
EQUIP_BOOK_TRIPLE,
EQUIP_BOOK_DUAL_QUICK,
EQUIP_BOOK_TRIPLE_QUICK,
EQUIP_RAPID_SHOT,
// familiars
EQUIP_FAIRY,
EQUIP_FAIRY_ICE,
EQUIP_FAIRY_FIRE,
EQUIP_FAIRY_POISON,
EQUIP_FAIRY_TARGET,
EQUIP_PET_SLIME,
// spells
EQUIP_SPELL_TELEPORT,
EQUIP_SPELL_SLIME_EXPLODE,
EQUIP_SPELL_FIREBALL,
EQUIP_SPELL_FREEZE,
EQUIP_SPELL_EARTHQUAKE,
EQUIP_SPELL_PROTECTION,
EQUIP_SPELL_WEB,
EQUIP_SPELL_FLOWER,
EQUIP_SPELL_FAIRY,
// others
EQUIP_BOSS_KEY,
EQUIP_FLOOR_MAP,
EQUIP_ALCOHOL,
EQUIP_LUCK,
EQUIP_FAIRY_POWDER
};
#endif
diff --git a/src/PlayerEntity.cpp b/src/PlayerEntity.cpp
index 43af164..1535aa0 100644
--- a/src/PlayerEntity.cpp
+++ b/src/PlayerEntity.cpp
@@ -1,2796 +1,2818 @@
#include "PlayerEntity.h"
#include "SlimeEntity.h"
#include "SlimePetEntity.h"
#include "FallingRockEntity.h"
#include "BoltEntity.h"
#include "SpiderWebEntity.h"
#include "EvilFlowerEntity.h"
#include "EnemyBoltEntity.h"
#include "ItemEntity.h"
#include "FairyEntity.h"
#include "sfml_game/ImageManager.h"
#include "sfml_game/SoundManager.h"
#include "Constants.h"
#include "WitchBlastGame.h"
#include "TextEntity.h"
#include "TextMapper.h"
#include <iostream>
#include <sstream>
#define SPIRAL_STAIRCASE
const int xHalo[9][3] =
{
{ 13, 13, 18},
{ 47, 45, 37},
{ 48, 47, 44},
{ 15, 15, 16},
{ 45, 45, 45},
{ 46, 44, 42},
{ 13, 13, 13},
{ 13, 24, 36},
{ 13, 17, 13}
};
const int yHalo[9][3] =
{
{ 26, 25, 25},
{ 23, 23, 23},
{ 23, 24, 25},
{ 31, 32, 34},
{ 23, 23, 23},
{ 23, 22, 21},
{ 26, 26, 26},
{ 26, 15, 6},
{ 25, 27, 25}
};
PlayerEntity::PlayerEntity(float x, float y)
: BaseCreatureEntity (ImageManager::getInstance().getImage(IMAGE_PLAYER_0), x, y, 64, 96)
{
currentFireDelay = -1.0f;
randomFireDelay = -1.0f;
invincibleDelay = -1.0f;
divineInterventionDelay = -1.0f;
fireAnimationDelay = -1.0f;
fireAnimationDelayMax = 0.4f;
spellAnimationDelay = -1.0f;
spellAnimationDelayMax = 0.7f;
canFirePlayer = true;
type = ENTITY_PLAYER;
imagesProLine = 8;
playerStatus = playerStatusPlaying;
hp = INITIAL_PLAYER_HP;
#ifdef TEST_MODE
hp = INITIAL_PLAYER_HP * 100;
#endif // TEST_MODE
hpDisplay = hp;
hpMax = hp;
gold = 0;
deathAge = -1.0f;
hiccupDelay = HICCUP_DELAY;
idleAge = 0.0f;
boltLifeTime = INITIAL_BOLT_LIFE;
specialBoltTimer = -1.0f;
bloodColor = BloodRed;
canExplode = false;
// init the equipment (to empty)
for (int i = 0; i < NUMBER_EQUIP_ITEMS; i++) equip[i] = false;
collidingDirection = 0;
// init the shots (to none)
for (int i = 0; i < SPECIAL_SHOT_SLOTS; i++)
{
specialShots[i] = ShotTypeStandard;
specialShotLevel[i] = 0;
}
specialShotIndex = 0;
needInitShotType = false;
computePlayer();
firingDirection = 5;
facingDirection = 2;
sprite.setOrigin(32, 80);
protection.active = false;
armor = 0.0f;
activeSpell.delay = -1.0f;
activeSpell.spell = SpellNone;
divinity.divinity = -1;
divinity.piety = 0;
divinity.level = 0;
divinity.interventions = 0;
divinity.percentsToNextLevels = 0.0f;
isRegeneration = false;
isFairyTransmuted = false;
itemToBuy = NULL;
}
void PlayerEntity::moveTo(float newX, float newY)
{
float dx = newX - x;
float dy = newY - y;
x = newX;
y = newY;
for(int unsigned i = 0; i < fairies.size(); i++)
{
fairies[i]->setX(fairies[i]->getX() + dx);
fairies[i]->setY(fairies[i]->getY() + dy);
}
}
int PlayerEntity::getFacingDirection()
{
return facingDirection;
}
void PlayerEntity::setFacingDirection(int facingDirection)
{
if (facingDirection == 4 || facingDirection == 6 || facingDirection == 2 || facingDirection == 8)
this->facingDirection = facingDirection;
}
float PlayerEntity::getPercentFireDelay()
{
if (canFirePlayer) return 1.0f;
else return (1.0f - currentFireDelay / fireDelay);
}
float PlayerEntity::getLightCone()
{
if (playerStatus == playerStatusPraying)
{
float result = 1.0f;
if (statusTimer < 0.25f)
result = 4 * statusTimer;
else if (statusTimer > WORSHIP_DELAY - 0.25f)
result = (WORSHIP_DELAY - statusTimer) * 4;
return result;
}
else if (divineInterventionDelay > 0.0f)
{
if (isRegeneration) return -1.0f;
float result = 1.0f;
if (divineInterventionDelay < 0.25f)
result = 4 * divineInterventionDelay;
else if (divineInterventionDelay > WORSHIP_DELAY - 0.25f)
result = (WORSHIP_DELAY - divineInterventionDelay) * 4;
return result;
}
else return -1.0f;
}
float PlayerEntity::getPercentSpellDelay()
{
if (activeSpell.spell == SpellNone)
return getPercentFireDelay();
else
{
if (activeSpell.delay <= 0.0f) return 1.0f;
else return (1.0f - activeSpell.delay / activeSpell.delayMax);
}
}
bool PlayerEntity::isPoisoned()
{
return (specialState[SpecialStatePoison].active);
}
int PlayerEntity::getCollidingDirection()
{
return collidingDirection;
}
PlayerEntity::playerStatusEnum PlayerEntity::getPlayerStatus()
{
return playerStatus;
}
void PlayerEntity::setPlayerStatus(PlayerEntity::playerStatusEnum playerStatus)
{
this->playerStatus = playerStatus;
}
bool PlayerEntity::isDead()
{
return playerStatus == playerStatusDead;
}
enemyTypeEnum PlayerEntity::getLastHurtingEnemy()
{
return lastHurtingEnemy;
}
sourceTypeEnum PlayerEntity::getLastHurtingSource()
{
return lastHurtingSource;
}
float PlayerEntity::getDeathAge()
{
return deathAge;
}
void PlayerEntity::setDeathAge(float deathAge)
{
this->deathAge = deathAge;
}
bool PlayerEntity::getFairyTransmuted()
{
return isFairyTransmuted;
}
divinityStruct PlayerEntity::getDivinity()
{
return divinity;
}
int PlayerEntity::getPiety()
{
return divinity.piety;
}
void PlayerEntity::stuck()
{
castTeleport();
}
void PlayerEntity::setEntering()
{
playerStatus = playerStatusEntering;
}
void PlayerEntity::setLeavingLevel()
{
playerStatus = playerStatusGoingNext;
}
void PlayerEntity::pay(int price)
{
gold -= price;
displayAcquiredGold(-price);
if (gold < 0) gold = 0;
SoundManager::getInstance().playSound(SOUND_PAY);
}
void PlayerEntity::acquireItemAfterStance()
{
if (acquiredItem >= FirstEquipItem)
{
equip[acquiredItem - FirstEquipItem] = true;
if (acquiredItem != ItemBossKey) game().proceedEvent(EventGetItem);
// familiar
if (items[acquiredItem].familiar != FamiliarNone)
{
setEquiped(acquiredItem - FirstEquipItem, true);
game().proceedEvent(EventGetFamiliar);
}
// shot types
else if (items[acquiredItem].specialShot != (ShotTypeStandard))
{
registerSpecialShot(acquiredItem);
game().proceedEvent(EventGetSpecialShot);
}
// spells
else if (items[acquiredItem].spell != SpellNone)
{
setActiveSpell(items[acquiredItem].spell, false);
game().proceedEvent(EventGetSpell);
}
// spells
else if (items[acquiredItem].spell != SpellNone)
{
setActiveSpell(items[acquiredItem].spell, false);
game().proceedEvent(EventGetSpell);
}
// pet slime
else if (acquiredItem == ItemPetSlime)
{
new SlimePetEntity();
}
// floor item
else if (acquiredItem == ItemFloorMap)
game().revealFloor();
else if (acquiredItem == ItemAlcohol)
hiccupDelay = HICCUP_DELAY;
// acquirement
if (equip[EQUIP_DISPLACEMENT_GLOVES] && equip[EQUIP_LEATHER_BOOTS] && equip[EQUIP_MAGICIAN_HAT] && equip[EQUIP_MAGICIAN_HAT])
game().registerAchievement(AchievementCompleteSet);
computePlayer();
}
else
{
if (acquiredItem == ItemBossHeart)
{
int hpBonus = 2 + rand() % 4;
hpMax += hpBonus;
hp += hpBonus;
hpDisplay += hpBonus;
SoundManager::getInstance().playSound(SOUND_EAT);
std::ostringstream oss;
oss << "HP Max +" << hpBonus;
TextEntity* text = new TextEntity(oss.str(), 15, x, y - 50.0f);
text->setColor(TextEntity::COLOR_FADING_GREEN);
text->setAlignment(ALIGN_CENTER);
text->setAge(-1.0f);
text->setLifetime(1.2f);
text->setWeight(-60.0f);
text->setType(ENTITY_FLYING_TEXT);
text->setZ(2000);
}
else if (acquiredItem == ItemBonusHealth)
{
hpMax += 1;
hp = hpMax;
SoundManager::getInstance().playSound(SOUND_EAT);
TextEntity* text = new TextEntity("HP Max + 1", 15, x, y - 50.0f);
text->setColor(TextEntity::COLOR_FADING_GREEN);
text->setAlignment(ALIGN_CENTER);
text->setAge(-1.0f);
text->setLifetime(1.2f);
text->setWeight(-60.0f);
text->setType(ENTITY_FLYING_TEXT);
text->setZ(2000);
}
}
spriteItem->setDying(true);
spriteItemStar->setDying(true);
playerStatus = playerStatusPlaying;
}
void PlayerEntity::resetFloorItem()
{
equip[EQUIP_BOSS_KEY] = false;
equip[EQUIP_FLOOR_MAP] = false;
equip[EQUIP_ALCOHOL] = false;
equip[EQUIP_FAIRY_POWDER] = false;
equip[EQUIP_LUCK] = false;
computePlayer();
}
void PlayerEntity::setItemToBuy(ItemEntity* item)
{
itemToBuy = item;
}
ItemEntity* PlayerEntity::getItemToBuy()
{
return itemToBuy;
}
void PlayerEntity::animate(float delay)
{
// shot timer
if (specialBoltTimer >= 0.0f)
{
specialBoltTimer -= delay;
if (specialBoltTimer <= 0.0f)
{
if (getShotType() == ShotTypeIce) SoundManager::getInstance().playSound(SOUND_ICE_CHARGE);
}
}
if (playerStatus == playerStatusGoingNext)
{
return;
}
if (playerStatus == playerStatusStairs)
{
x += velocity.x * delay;
y += velocity.y * delay;
age += delay;
frame = ((int)(age * 7.0f)) % 4;
if (frame == 3) frame = 1;
if (x < (MAP_WIDTH / 2) * TILE_WIDTH - TILE_WIDTH / 2)
{
facingDirection = 8;
game().moveToOtherMap(8);
}
return;
}
// rate of fire
if (!canFirePlayer)
{
currentFireDelay -= delay;
canFirePlayer = (currentFireDelay <= 0.0f);
}
if (randomFireDelay >= 0.0f) randomFireDelay -= delay;
// spells
if (activeSpell.spell != SpellNone && activeSpell.delay > 0.0f)
{
if (game().getCurrentMap()->isCleared())
activeSpell.delay -= 40 * delay;
else
activeSpell.delay -= delay;
if (activeSpell.spell == SpellProtection && protection.active)
activeSpell.delay = activeSpell.delayMax;
if (activeSpell.delay <= 0.0f) SoundManager::getInstance().playSound(SOUND_SPELL_CHARGE);
}
// protection
if (protection.active)
{
protection.timer -= delay;
if (protection.timer <= 0.0f)
{
protection.active = false;
computePlayer();
}
}
// acquisition animation
if (playerStatus == playerStatusAcquire)
{
statusTimer -= delay;
if (statusTimer <= 0.0f)
{
acquireItemAfterStance();
}
}
else if (equip[EQUIP_ALCOHOL] && playerStatus == playerStatusPlaying)
{
hiccupDelay -= delay;
if (hiccupDelay <= 0.0f)
{
hiccupDelay = 4.0f;
// hiccup
recoil.active = true;
recoil.stun = true;
recoil.velocity = Vector2D(350.0f);
recoil.timer = 0.4f;
BoltEntity* bolt = new BoltEntity(x, getBolPositionY(), boltLifeTime, ShotTypePoison, 0);
bolt->setDamages(fireDamages);
bolt->setFlying(isFairyTransmuted);
bolt->setVelocity(recoil.velocity.vectorTo(Vector2D(0, 0), fireVelocity));
TextEntity* text = new TextEntity("*hic*", 16, x, y - 30.0f);
text->setColor(TextEntity::COLOR_FADING_GREEN);
text->setAge(-0.6f);
text->setLifetime(0.3f);
text->setWeight(-60.0f);
text->setZ(2000);
text->setAlignment(ALIGN_CENTER);
text->setType(ENTITY_FLYING_TEXT);
SoundManager::getInstance().playSound(SOUND_HICCUP);
SoundManager::getInstance().playSound(SOUND_BLAST_STANDARD);
}
}
if (divineInterventionDelay > 0.0f) divineInterventionDelay -= delay;
if (fireAnimationDelay > 0.0f)
{
fireAnimationDelay -= delay;
if (fireAnimationDelay <= 0.0f) fireAnimationDelay = -1.0f;
}
if (spellAnimationDelay > 0.0f)
{
spellAnimationDelay -= delay;
if (spellAnimationDelay <= 0.0f) spellAnimationDelay = -1.0f;
}
// unlocking animation
else if (playerStatus == playerStatusUnlocking || playerStatus == playerStatusPraying)
{
statusTimer -= delay;
if (statusTimer <= 0.0f)
{
playerStatus = playerStatusPlaying;
}
}
if (playerStatus == playerStatusDead)
{
deathAge += delay;
velocity = Vector2D(0.0f, 0.0f);
}
else
testSpriteCollisions();
// key room collision
if (game().getCurrentMap()->getRoomType() == roomTypeKey && !game().getCurrentMap()->isCleared())
{
sf::IntRect col1;
col1.width = 198;
col1.height = 68;
col1.top = 254;
col1.left = 380;
sf::IntRect col2;
col2.width = 68;
col2.height = 198;
col2.top = 189;
col2.left = 445;
if (boundingBox.intersects(col1) || boundingBox.intersects(col2))
{
recoil.active = true;
recoil.stun = true;
recoil.velocity = Vector2D(GAME_WIDTH / 2, GAME_HEIGHT /2).vectorTo(Vector2D(x, y), 650.0f);
recoil.timer = 0.4f;
game().activateKeyRoomEffect(true);
}
}
collidingDirection = 0;
BaseCreatureEntity::animate(delay);
if (firingDirection != 5)
facingDirection = firingDirection;
// find the frame
if (firingDirection != 5)
{
if (fireAnimationDelay < 0.0f)
fireAnimationDelay = fireAnimationDelayMax;
fireAnimationDirection = firingDirection;
}
else if (isMoving())
{
frame = ((int)(age * 7.0f)) % 4;
if (frame == 3) frame = 1;
}
else if (playerStatus == playerStatusAcquire || playerStatus == playerStatusUnlocking || playerStatus == playerStatusPraying)
frame = 3;
else if (playerStatus == playerStatusDead)
frame = 0;
else // standing
{
frame = 1;
}
if (playerStatus != playerStatusPlaying || isMoving() || firingDirection != 5)
idleAge = 0.0f;
else
idleAge += delay;
if (x < 0)
game().moveToOtherMap(4);
else if (x > MAP_WIDTH * TILE_WIDTH)
game().moveToOtherMap(6);
else if (y < 0)
game().moveToOtherMap(8);
else if (y > MAP_HEIGHT * TILE_HEIGHT)
game().moveToOtherMap(2);
#ifdef SPIRAL_STAIRCASE
else if (playerStatus == playerStatusPlaying
&& game().getCurrentMap()->getRoomType() == roomTypeExit && y < TILE_HEIGHT * 0.6f)
{
playerStatus = playerStatusStairs;
velocity.y = creatureSpeed / 12;
velocity.x = -creatureSpeed / 3;
facingDirection = 4;
SpriteEntity* doorEntity = new SpriteEntity(ImageManager::getInstance().getImage(IMAGE_TILES),
(MAP_WIDTH / 2) * TILE_WIDTH - TILE_WIDTH / 2,
TILE_HEIGHT / 2, 64, 64, 1);
doorEntity->setZ(TILE_HEIGHT);
doorEntity->setImagesProLine(10);
doorEntity->setFrame(189);
doorEntity->setType(ENTITY_EFFECT);
}
#endif
if (playerStatus == playerStatusEntering)
{
if (boundingBox.left > TILE_WIDTH
&& (boundingBox.left + boundingBox.width) < TILE_WIDTH * (MAP_WIDTH - 1)
&& boundingBox.top > TILE_HEIGHT
&& (boundingBox.top + boundingBox.height) < TILE_HEIGHT * (MAP_HEIGHT - 1))
{
playerStatus = playerStatusPlaying;
game().closeDoors();
}
}
if (playerStatus != playerStatusDead)
{
if (invincibleDelay >= 0.0f) invincibleDelay -= delay;
}
z = y + 4;
}
bool PlayerEntity::canCollide()
{
return invincibleDelay <= 0.0f;
}
void PlayerEntity::setSpecialState(enumSpecialState state, bool active, float timer, float param1, float param2)
{
BaseCreatureEntity::setSpecialState(state, active, timer, param1, param2);
computePlayer();
}
void PlayerEntity::renderPlayer(sf::RenderTarget* app)
{
sf::Color savedColor = sprite.getColor();
if (isPoisoned()) sprite.setColor(sf::Color(180, 255, 180, 255));
// body
if (isMirroring)
sprite.setTextureRect(sf::IntRect( frame * width + width, spriteDy * height, -width, height));
else
sprite.setTextureRect(sf::IntRect( frame * width, spriteDy * height, width, height));
app->draw(sprite);
sprite.setColor(savedColor);
// boots
- if (equip[EQUIP_LEATHER_BOOTS] && playerStatus != playerStatusDead)
+ if (equip[EQUIP_BOOTS_ADVANCED] && playerStatus != playerStatusDead)
+ {
+ sprite.setTexture(*ImageManager::getInstance().getImage(IMAGE_PLAYER_1));
+ if (isMirroring)
+ sprite.setTextureRect(sf::IntRect( (21 + frame) * width + width, spriteDy * height, -width, height));
+ else
+ sprite.setTextureRect(sf::IntRect( (21 + frame) * width, spriteDy * height, width, height));
+ app->draw(sprite);
+ sprite.setTexture(*ImageManager::getInstance().getImage(IMAGE_PLAYER_0));
+ }
+ else if (equip[EQUIP_LEATHER_BOOTS] && playerStatus != playerStatusDead)
{
if (isMirroring)
sprite.setTextureRect(sf::IntRect( (9 + frame) * width + width, spriteDy * height, -width, height));
else
sprite.setTextureRect(sf::IntRect( (9 + frame) * width, spriteDy * height, width, height));
app->draw(sprite);
}
if (equip[EQUIP_ROBE_ADVANCED] && playerStatus != playerStatusDead)
{
sprite.setTexture(*ImageManager::getInstance().getImage(IMAGE_PLAYER_1));
if (isMirroring)
sprite.setTextureRect(sf::IntRect( (12 + frame) * width + width, spriteDy * height, -width, height));
else
sprite.setTextureRect(sf::IntRect( (12 + frame) * width, spriteDy * height, width, height));
app->draw(sprite);
if (isMirroring)
sprite.setTextureRect(sf::IntRect( (15 + frame) * width + width, spriteDy * height, -width, height));
else
sprite.setTextureRect(sf::IntRect( (15 + frame) * width, spriteDy * height, width, height));
sprite.setColor(sf::Color(255, 255, 255, 100 + 100 * cosf(game().getAbsolutTime() * 3.5f)));
app->draw(sprite, sf::BlendAdd);
sprite.setColor(sf::Color(255, 255, 255, 255));
sprite.setTexture(*ImageManager::getInstance().getImage(IMAGE_PLAYER_0));
}
else if (equip[EQUIP_MAGICIAN_ROBE])
{
if (isMirroring)
sprite.setTextureRect(sf::IntRect( (12 + frame) * width + width, spriteDy * height, -width, height));
else
sprite.setTextureRect(sf::IntRect( (12 + frame) * width, spriteDy * height, width, height));
app->draw(sprite);
}
- if (equip[EQUIP_DISPLACEMENT_GLOVES])
+ if (equip[EQUIP_GLOVES_ADVANCED] && playerStatus != playerStatusDead)
+ {
+ sprite.setTexture(*ImageManager::getInstance().getImage(IMAGE_PLAYER_1));
+ if (isMirroring)
+ sprite.setTextureRect(sf::IntRect( (24 + frame) * width + width, spriteDy * height, -width, height));
+ else
+ sprite.setTextureRect(sf::IntRect( (24 + frame) * width, spriteDy * height, width, height));
+ app->draw(sprite);
+ sprite.setTexture(*ImageManager::getInstance().getImage(IMAGE_PLAYER_0));
+ }
+ else if (equip[EQUIP_DISPLACEMENT_GLOVES])
{
if (isMirroring)
sprite.setTextureRect(sf::IntRect( (21 + frame) * width + width, spriteDy * height, -width, height));
else
sprite.setTextureRect(sf::IntRect( (21 + frame) * width, spriteDy * height, width, height));
app->draw(sprite);
}
if (equip[EQUIP_CRITICAL_ADVANCED])
{
if (isMirroring)
sprite.setTextureRect(sf::IntRect( (24 + frame) * width + width, spriteDy * height, -width, height));
else
sprite.setTextureRect(sf::IntRect( (24 + frame) * width, spriteDy * height, width, height));
app->draw(sprite);
}
else if (equip[EQUIP_CRITICAL])
{
sprite.setTexture(*ImageManager::getInstance().getImage(IMAGE_PLAYER_1));
if (isMirroring)
sprite.setTextureRect(sf::IntRect( (18 + frame) * width + width, spriteDy * height, -width, height));
else
sprite.setTextureRect(sf::IntRect( (18 + frame) * width, spriteDy * height, width, height));
app->draw(sprite);
sprite.setTexture(*ImageManager::getInstance().getImage(IMAGE_PLAYER_0));
}
if (equip[EQUIP_RAGE_AMULET])
{
if (isMirroring)
sprite.setTextureRect(sf::IntRect( (18 + frame) * width + width, spriteDy * height, -width, height));
else
sprite.setTextureRect(sf::IntRect( (18 + frame) * width, spriteDy * height, width, height));
app->draw(sprite);
}
if (equip[EQUIP_LEATHER_BELT])
{
if (isMirroring)
sprite.setTextureRect(sf::IntRect( (15 + frame) * width + width, spriteDy * height, -width, height));
else
sprite.setTextureRect(sf::IntRect( (15 + frame) * width, spriteDy * height, width, height));
app->draw(sprite);
}
// staff
int frameDx = equip[EQUIP_MAHOGANY_STAFF] ? 6 : 3;
if (isMirroring)
sprite.setTextureRect(sf::IntRect( (frameDx + frame) * width + width, spriteDy * height, -width, height));
else
sprite.setTextureRect(sf::IntRect( (frameDx + frame) * width, spriteDy * height, width, height));
app->draw(sprite);
if (equip[EQUIP_BLOOD_SNAKE])
{
if (isMirroring)
sprite.setTextureRect(sf::IntRect( (27 + frame) * width + width, spriteDy * height, -width, height));
else
sprite.setTextureRect(sf::IntRect( (27 + frame) * width, spriteDy * height, width, height));
app->draw(sprite);
}
if (equip[EQUIP_REAR_SHOT])
{
sprite.setTexture(*ImageManager::getInstance().getImage(IMAGE_PLAYER_1));
if (isMirroring)
sprite.setTextureRect(sf::IntRect( (frame) * width + width, spriteDy * height, -width, height));
else
sprite.setTextureRect(sf::IntRect( (frame) * width, spriteDy * height, width, height));
app->draw(sprite);
sprite.setTexture(*ImageManager::getInstance().getImage(IMAGE_PLAYER_0));
}
// shot type
if (getShotType() != ShotTypeStandard)
{
switch (getShotType())
{
case ShotTypeIce:
sprite.setColor(sf::Color(100, 220, 255, 255));
break;
case ShotTypeStone:
sprite.setColor(sf::Color(120, 120, 150, 255));
break;
case ShotTypeLightning:
sprite.setColor(sf::Color(255, 255, 0, 255));
break;
case ShotTypeIllusion:
sprite.setColor(sf::Color(240, 180, 250, 255));
break;
case ShotTypeStandard:
sprite.setColor(sf::Color(255, 255, 255, 0));
break;
case ShotTypeFire:
sprite.setColor(sf::Color(255, 180, 0, 255));
break;
case ShotTypePoison:
sprite.setColor(sf::Color(50, 255, 50, 255));
break;
default:
std::cout << "[WARNING] Can not render shot type: " << getShotType() << std::endl;
}
sprite.setTexture(*ImageManager::getInstance().getImage(IMAGE_PLAYER_1));
if (isMirroring)
sprite.setTextureRect(sf::IntRect( (3 + frame) * width + width, spriteDy * height, -width, height));
else
sprite.setTextureRect(sf::IntRect( (3 + frame) * width, spriteDy * height, width, height));
app->draw(sprite);
sprite.setColor(savedColor);
sprite.setTexture(*ImageManager::getInstance().getImage(IMAGE_PLAYER_0));
}
// hat
if (equip[EQUIP_HAT_ADVANCED] && playerStatus != playerStatusDead)
{
sprite.setTexture(*ImageManager::getInstance().getImage(IMAGE_PLAYER_1));
if (isMirroring)
sprite.setTextureRect(sf::IntRect( (9 + frame) * width + width, spriteDy * height, -width, height));
else
sprite.setTextureRect(sf::IntRect( (9 + frame) * width, spriteDy * height, width, height));
app->draw(sprite);
sprite.setTexture(*ImageManager::getInstance().getImage(IMAGE_PLAYER_0));
}
else if (equip[EQUIP_MAGICIAN_HAT] && playerStatus != playerStatusDead)
{
sprite.setTexture(*ImageManager::getInstance().getImage(IMAGE_PLAYER_1));
if (isMirroring)
sprite.setTextureRect(sf::IntRect( (6 + frame) * width + width, spriteDy * height, -width, height));
else
sprite.setTextureRect(sf::IntRect( (6 + frame) * width, spriteDy * height, width, height));
app->draw(sprite);
sprite.setTexture(*ImageManager::getInstance().getImage(IMAGE_PLAYER_0));
}
}
void PlayerEntity::renderHalo(sf::RenderTarget* app)
{
if (frame > 2 || spriteDy > 8) return;
// gems
if ((getShotType() == ShotTypeIce || getShotType() == ShotTypeLightning || getShotType() == ShotTypeFire) && playerStatus != playerStatusDead)
{
int fade;
sf::Color savedColor = sprite.getColor();
if (getShotType() != ShotTypeIce || specialBoltTimer <= 0.0f) fade = 255;
else fade = ((STATUS_FROZEN_BOLT_DELAY[getShotLevel()] - specialBoltTimer) / STATUS_FROZEN_BOLT_DELAY[getShotLevel()]) * 128;
if (getShotType() == ShotTypeLightning)
fade = 150 + rand() % 105;
if (getShotType() == ShotTypeFire)
fade = 200 + rand() % 40;
if (getShotType() == ShotTypeIce)
sprite.setTextureRect(sf::IntRect(448, 864, 20, 20));
else if (getShotType() == ShotTypeLightning)
sprite.setTextureRect(sf::IntRect(448 + 20, 864, 20, 20));
else if (getShotType() == ShotTypeFire)
sprite.setTextureRect(sf::IntRect(448 + 40, 864, 20, 20));
sprite.setColor(sf::Color(255, 255, 255, fade));
if (isMirroring)
sprite.setPosition(x - 10 + 64 - xHalo[spriteDy][frame], y - 10 + yHalo[spriteDy][frame]);
else
sprite.setPosition(x - 10 + xHalo[spriteDy][frame], y - 10 + yHalo[spriteDy][frame]);
sf::RenderStates r;
r.blendMode = sf::BlendAdd;
app->draw(sprite, r);
sprite.setPosition(x, y);
sprite.setColor(savedColor);
}
}
void PlayerEntity::render(sf::RenderTarget* app)
{
sprite.setPosition(x, y);
spriteDy = 0;
isMirroring = false;
if (idleAge > 8.5f)
{
idleAge -= 8.5f;
}
else if (idleAge >= 7.5)
{
spriteDy = 8;
frame = 2;
}
else if (idleAge >= 7.0)
{
spriteDy = 8;
frame = 1;
}
else if (idleAge >= 6.0)
{
spriteDy = 8;
frame = 0;
}
else if (idleAge >= 5.5f && facingDirection != 2)
{
facingDirection = 2;
idleAge -= 2.0f;
}
else if (fireAnimationDelay <= 0.0f && spellAnimationDelay <= 0.0f)
{
if (facingDirection == 6) spriteDy = 1;
else if (facingDirection == 8) spriteDy = 2;
else if (facingDirection == 4)
{
spriteDy = 1;
isMirroring = true;
}
}
else if (spellAnimationDelay >= 0.0f)
{
spriteDy = 7;
if (spellAnimationDelay < spellAnimationDelayMax * 0.1f) frame = 0;
else if (spellAnimationDelay < spellAnimationDelayMax * 0.2f) frame = 1;
else if (spellAnimationDelay < spellAnimationDelayMax * 0.7f) frame = 2;
else if (spellAnimationDelay < spellAnimationDelayMax * 0.85f) frame = 1;
else frame = 0;
}
else
{
if (fireAnimationDirection == 2) spriteDy = 3;
else if (fireAnimationDirection == 6) spriteDy = 4;
else if (fireAnimationDirection == 8) spriteDy = 5;
else if (fireAnimationDirection == 4)
{
spriteDy = 4;
isMirroring = true;
}
if (fireAnimationDelay < fireAnimationDelayMax * 0.2f) frame = 0;
else if (fireAnimationDelay < fireAnimationDelayMax * 0.4f) frame = 1;
else if (fireAnimationDelay < fireAnimationDelayMax * 0.6f) frame = 2;
else if (fireAnimationDelay < fireAnimationDelayMax * 0.8f) frame = 1;
else frame = 0;
}
if (playerStatus == playerStatusAcquire || playerStatus == playerStatusUnlocking)
{
spriteDy = 6;
frame = ((int)(age * 10.0f)) % 4;
if (frame == 3) frame = 1;
}
else if (playerStatus == playerStatusPraying)
{
spriteDy = 7;
frame = ((int)(age * 10.0f)) % 4;
if (frame == 3) frame = 1;
float delay = playerStatus == playerStatusPraying ? WORSHIP_DELAY : UNLOCK_DELAY;
if (statusTimer < delay * 0.1f) frame = 0;
else if (statusTimer < delay * 0.2f) frame = 1;
else if (statusTimer < delay * 0.7f) frame = 2;
else if (statusTimer < delay * 0.85f) frame = 1;
else frame = 0;
}
if (playerStatus == playerStatusDead)
{
frame = (int)(deathAge / 0.35f);
if (frame > 6) frame = 6;
spriteDy = 9;
sprite.setTextureRect(sf::IntRect( frame * width, spriteDy * height, width, height));
app->draw(sprite);
}
else
{
if (isFairyTransmuted)
{
frame = 0;
if (velocity.x * velocity.x + velocity.y * velocity.y > 400)
frame = ((int)(age * 24.0f)) % 2;
else
frame = ((int)(age * 18.0f)) % 2;
sf::Sprite fairySprite;
fairySprite.setColor(sprite.getColor());
fairySprite.setTexture(*ImageManager::getInstance().getImage(IMAGE_FAIRY));
fairySprite.setPosition(sprite.getPosition());
fairySprite.setOrigin(26, 62);
switch (facingDirection)
{
case 8: fairySprite.setTextureRect(sf::IntRect( (2 + frame) * 48, 5 * 72, 48, 72)); break;
case 4: fairySprite.setTextureRect(sf::IntRect( (4 + frame) * 48, 5 * 72, 48, 72)); break;
case 6: fairySprite.setTextureRect(sf::IntRect( (5 + frame) * 48, 5 * 72, - 48, 72)); break;
default: fairySprite.setTextureRect(sf::IntRect( frame * 48, 5 * 72, 48, 72)); break;
}
app->draw(fairySprite);
}
else
{
renderHalo(app);
renderPlayer(app);
}
// shield
if (specialState[DivineStateProtection].active || protection.active)
{
int firstFrame = 8;
if (specialState[DivineStateProtection].active && divinity.divinity == DivinityStone) firstFrame = 16;
float timer = specialState[DivineStateProtection].active ? specialState[DivineStateProtection].timer : protection.timer;
sprite.setTextureRect(sf::IntRect( firstFrame * width, 9 * height, width, height));
app->draw(sprite);
sf::Color savedColor = sprite.getColor();
sprite.setColor(sf::Color(255, 255, 255, 100 + cos(age * (timer < 2.0f ? 25 : 10)) * 30 ));
sprite.setTextureRect(sf::IntRect( (firstFrame + 1) * width, 9 * height, width, height));
app->draw(sprite);
sprite.setColor(savedColor);
}
// divine field
if (divinity.level > 1)
{
bool displayField = false;
int fieldFrame;
int fieldFade;
switch (divinity.divinity)
{
case DivinityHealer:
{
displayField = true;
fieldFrame = 10;
fieldFade = 40 * (divinity.level - 1);
break;
}
case DivinityFighter:
{
displayField = true;
fieldFrame = 12;
fieldFade = 40 * (divinity.level - 1);
break;
}
case DivinityIce:
{
if (divinity.level > 2)
{
displayField = true;
fieldFrame = 14;
fieldFade = 80 * (divinity.level - 3);
}
break;
}
case DivinityStone:
{
if (divinity.level > 2)
{
displayField = true;
fieldFrame = 16;
fieldFade = 80 * (divinity.level - 3);
}
break;
}
}
if (displayField)
{
sf::Color savedColor = sprite.getColor();
sprite.setColor(sf::Color(255, 255, 255, fieldFade ));
sprite.setTextureRect(sf::IntRect( fieldFrame * width, 9 * height, width, height));
app->draw(sprite);
if (divinity.divinity != DivinityStone && divinity.divinity != DivinityHealer)
{
sprite.setColor(sf::Color(255, 255, 255, 2 + fieldFade / 2 + cos(age * 15) * fieldFade / 2 ));
sprite.setTextureRect(sf::IntRect( (fieldFrame + 1) * width, 9 * height, width, height));
app->draw(sprite);
sprite.setColor(savedColor);
}
if (divinity.divinity == DivinityHealer && divineInterventionDelay > 0.0f && isRegeneration)
{
sprite.setTextureRect(sf::IntRect( (fieldFrame + 1) * width, 9 * height, width, height));
app->draw(sprite);
}
}
}
}
if (game().getShowLogical() && playerStatus != playerStatusDead)
{
displayBoundingBox(app);
displayCenterAndZ(app);
}
}
void PlayerEntity::calculateBB()
{
if (isFairyTransmuted)
{
boundingBox.left = (int)x - 10;
boundingBox.width = 20;
boundingBox.top = (int)y - 29;
boundingBox.height = 20;
}
else
{
boundingBox.left = (int)x - 10;
boundingBox.width = 20;
boundingBox.top = (int)y - 29;
boundingBox.height = 33;
}
}
void PlayerEntity::readCollidingEntity(CollidingSpriteEntity* entity)
{
if (playerStatus == playerStatusDead || !canCollide()) return;
EnemyBoltEntity* boltEntity = dynamic_cast<EnemyBoltEntity*>(entity);
if (collideWithEntity(entity))
{
if (boltEntity != NULL && !boltEntity->getDying())
{
boltEntity->collide();
// TODO bolt source
hurt(getHurtParams(boltEntity->getDamages(),
boltEntity->getBoltType(),
boltEntity->getLevel(),
boltEntity->isCritical(),
SourceTypeBolt,
boltEntity->getEnemyType(),
false));
game().generateBlood(x, y, bloodColor);
float xs = (x + boltEntity->getX()) / 2;
float ys = (y + boltEntity->getY()) / 2;
SpriteEntity* star = new SpriteEntity(ImageManager::getInstance().getImage(IMAGE_HURT_IMPACT), xs, ys);
star->setFading(true);
star->setZ(y+ 100);
star->setLifetime(0.7f);
star->setType(ENTITY_EFFECT);
star->setSpin(400.0f);
}
}
}
void PlayerEntity::move(int direction)
{
if (playerStatus == playerStatusAcquire && statusTimer < ACQUIRE_DELAY / 2)
{
acquireItemAfterStance();
}
if (playerStatus == playerStatusPlaying)
{
float speedx = 0.0f, speedy = 0.0f;
if (direction == 4)
speedx = - creatureSpeed;
else if (direction == 1 || direction == 7)
speedx = - creatureSpeed * 0.7f;
else if (direction == 6)
speedx = creatureSpeed;
else if (direction == 3 || direction == 9)
speedx = creatureSpeed * 0.7f;
if (direction == 2)
speedy = creatureSpeed;
else if (direction == 1 || direction == 3)
speedy = creatureSpeed * 0.7f;
else if (direction == 8)
speedy = - creatureSpeed;
else if (direction == 7 || direction == 9)
speedy = - creatureSpeed * 0.7f;
setVelocity(Vector2D(speedx, speedy));
{
switch (direction)
{
case 8:
facingDirection = 8;
break;
case 2:
facingDirection = 2;
break;
case 4:
facingDirection = 4;
break;
case 6:
facingDirection = 6;
break;
case 7:
if (facingDirection != 4 && facingDirection != 8) facingDirection = 4;
break;
case 1:
if (facingDirection != 4 && facingDirection != 2) facingDirection = 4;
break;
case 9:
if (facingDirection != 6 && facingDirection != 8) facingDirection = 6;
break;
case 3:
if (facingDirection != 6 && facingDirection != 2) facingDirection = 6;
break;
}
}
}
}
bool PlayerEntity::isMoving()
{
if (velocity.x < -1.0f || velocity.x > 1.0f) return true;
if (velocity.y < -1.0f || velocity.y > 1.0f) return true;
return false;
}
bool PlayerEntity::isEquiped(int eq)
{
return equip[eq];
}
bool* PlayerEntity::getEquipment()
{
return equip;
}
void PlayerEntity::setEquiped(int item, bool toggleEquipped)
{
equip[item] = toggleEquipped;
if (toggleEquipped && items[FirstEquipItem + item].familiar > FamiliarNone)
{
FairyEntity* fairy = new FairyEntity(x - 50.0f + rand() % 100,
y - 50.0f + rand() % 100,
items[FirstEquipItem + item].familiar);
fairies.push_back(fairy);
}
computePlayer();
}
void PlayerEntity::generateBolt(float velx, float vely)
{
enumShotType boltType = ShotTypeStandard;
unsigned int shotLevel = 1;
switch (getShotType())
{
case ShotTypeIce:
if (getShotType() == ShotTypeIce)
{
if (specialBoltTimer <= 0.0f)
{
boltType = ShotTypeIce;
shotLevel = getShotLevel();
needInitShotType = true;
}
else boltType = ShotTypeCold;
}
break;
case ShotTypeStandard:
case ShotTypeIllusion:
case ShotTypeStone:
case ShotTypeLightning:
case ShotTypeFire:
case ShotTypePoison:
boltType = getShotType();
shotLevel = getShotLevel();
break;
default:
std::cout << "[WARNING] Can not generate shot type: " << getShotType() << std::endl;
}
BoltEntity* bolt = new BoltEntity(x, getBolPositionY(), boltLifeTime, boltType, shotLevel);
bolt->setFlying(isFairyTransmuted);
int boltDamage = fireDamages;
if (criticalChance > 0)
if (rand()% 100 < criticalChance)
{
boltDamage *= equip[EQUIP_CRITICAL_ADVANCED] ? 3 : 2;
bolt->setCritical(true);
}
bolt->setDamages(boltDamage);
if (equip[EQUIP_DISPLACEMENT_GLOVES])
{
if (firingDirection == 2 || firingDirection == 8)
velx += velocity.x * 0.7f;
else if (firingDirection == 4 || firingDirection == 6)
vely += velocity.y * 0.7f;
}
bolt->setVelocity(Vector2D(velx, vely));
}
void PlayerEntity::rageFire()
{
for (int i = -1; i <= 1; i += 2)
for (int j = -1; j <= 1; j += 2)
{
BoltEntity* bolt = new BoltEntity(x, getBolPositionY(), boltLifeTime, ShotTypeFire, 0);
bolt->setDamages(10);
bolt->setFlying(isFairyTransmuted);
float velx = fireVelocity * i * 0.42f;
float vely = fireVelocity * j * 0.42f;
bolt->setVelocity(Vector2D(velx, vely));
if (hp <= hpMax / 5)
{
BoltEntity* bolt = new BoltEntity(x, getBolPositionY(), boltLifeTime, ShotTypeFire, 0);
bolt->setDamages(10);
bolt->setFlying(isFairyTransmuted);
float velx = 0.0f;
float vely = 0.0f;
if (i == -1 && j == -1) velx = -fireVelocity * i * 0.6f;
else if (i == -1 && j == 1) velx = fireVelocity * i * 0.6f;
else if (i == 1 && j == -1) vely= -fireVelocity * i * 0.6f;
else if (i == 1 && j == 1) vely = fireVelocity * i * 0.6f;
bolt->setVelocity(Vector2D(velx, vely));
}
}
SoundManager::getInstance().playSound(SOUND_BLAST_FIRE);
}
void PlayerEntity::resestFireDirection()
{
firingDirection = 5;
}
int PlayerEntity::getFireDirection()
{
return firingDirection;
}
void PlayerEntity::fire(int direction)
{
firingDirection = direction;
if (playerStatus != playerStatusDead)
for(int unsigned i = 0; i < fairies.size(); i++)
fairies[i]->fire(direction);
if (canFirePlayer && playerStatus != playerStatusDead && playerStatus != playerStatusAcquire)
{
switch (getShotType())
{
case ShotTypeCold:
case ShotTypeIce:
SoundManager::getInstance().playPitchModSound(SOUND_BLAST_ICE);
break;
case ShotTypeFire:
SoundManager::getInstance().playPitchModSound(SOUND_BLAST_FIRE);
break;
case ShotTypeIllusion:
SoundManager::getInstance().playPitchModSound(SOUND_BLAST_ILLUSION);
break;
case ShotTypeLightning:
SoundManager::getInstance().playPitchModSound(SOUND_BLAST_LIGHTNING);
break;
case ShotTypePoison:
SoundManager::getInstance().playPitchModSound(SOUND_BLAST_POISON);
break;
case ShotTypeStone:
SoundManager::getInstance().playPitchModSound(SOUND_BLAST_STONE);
break;
default:
SoundManager::getInstance().playPitchModSound(SOUND_BLAST_STANDARD);
break;
}
if (equip[EQUIP_BOOK_DUAL] || equip[EQUIP_BOOK_TRIPLE]
|| equip[EQUIP_BOOK_DUAL_QUICK] || equip[EQUIP_BOOK_TRIPLE_QUICK])
{
float shoot_angle = 0.2f;
if ((direction == 4 && velocity.x < -1.0f) || (direction == 6 && velocity.x > 1.0f)
|| (direction == 8 && velocity.y < -1.0f) || (direction == 2 && velocity.y > 1.0f))
shoot_angle = 0.1f;
else if ((direction == 6 && velocity.x < -1.0f) || (direction == 4 && velocity.x > 1.0f)
|| (direction == 2 && velocity.y < -1.0f) || (direction == 8 && velocity.y > 1.0f))
shoot_angle = (equip[EQUIP_BOOK_TRIPLE] || equip[EQUIP_BOOK_TRIPLE_QUICK]) ? 0.35f : 0.2f;
else if (!equip[EQUIP_BOOK_TRIPLE] && !equip[EQUIP_BOOK_TRIPLE_QUICK])
shoot_angle = 0.1f;
switch(direction)
{
case 4:
generateBolt(-fireVelocity * cos(shoot_angle), fireVelocity * sin(shoot_angle));
generateBolt(-fireVelocity * cos(shoot_angle), - fireVelocity * sin(shoot_angle));
break;
case 6:
generateBolt(fireVelocity * cos(shoot_angle), fireVelocity * sin(shoot_angle));
generateBolt(fireVelocity * cos(shoot_angle), - fireVelocity * sin(shoot_angle));
break;
case 8:
generateBolt(fireVelocity * sin(shoot_angle), -fireVelocity * cos(shoot_angle));
generateBolt(-fireVelocity * sin(shoot_angle), - fireVelocity * cos(shoot_angle));
break;
case 2:
generateBolt(fireVelocity * sin(shoot_angle), fireVelocity * cos(shoot_angle));
generateBolt(-fireVelocity * sin(shoot_angle), fireVelocity * cos(shoot_angle));
break;
}
}
if (equip[EQUIP_RAPID_SHOT])
{
Vector2D boltDirection;
switch(direction)
{
case 4:
boltDirection = Vector2D(0, 0).vectorNearlyTo(Vector2D(-1, 0), fireVelocity, 0.2f);
break;
case 6:
boltDirection = Vector2D(0, 0).vectorNearlyTo(Vector2D(1, 0), fireVelocity, 0.2f);
break;
case 8:
boltDirection = Vector2D(0, 0).vectorNearlyTo(Vector2D(0, -1), fireVelocity, 0.2f);
break;
case 2:
boltDirection = Vector2D(0, 0).vectorNearlyTo(Vector2D(0, 1), fireVelocity, 0.2f);
break;
}
generateBolt(boltDirection.x, boltDirection.y);
}
else if (!(equip[EQUIP_BOOK_DUAL] || equip[EQUIP_BOOK_DUAL_QUICK]) || (equip[EQUIP_BOOK_TRIPLE] || equip[EQUIP_BOOK_TRIPLE_QUICK]))
{
switch(direction)
{
case 4:
generateBolt(-fireVelocity, 0.0f);
break;
case 6:
generateBolt(fireVelocity, 0.0f);
break;
case 8:
generateBolt(0.0f, -fireVelocity);
break;
case 2:
generateBolt(0.0f, fireVelocity);
break;
}
}
if (equip[EQUIP_REAR_SHOT])
{
BoltEntity* bolt = new BoltEntity(x, getBolPositionY(), boltLifeTime, ShotTypeStandard, 0);
bolt->setDamages(fireDamages / 2);
bolt->setFlying(isFairyTransmuted);
float velx = 0.0f;
float vely = 0.0f;
switch (direction)
{
case 4:
velx = fireVelocity * 0.75f;
break;
case 6:
velx = -fireVelocity * 0.75f;
break;
case 2:
vely = -fireVelocity * 0.75f;
break;
case 8:
vely = fireVelocity * 0.75f;
break;
}
bolt->setVelocity(Vector2D(velx, vely));
}
if (equip[EQUIP_BOOK_RANDOM] && randomFireDelay <= 0.0f)
{
BoltEntity* bolt = new BoltEntity(x, getBolPositionY(), boltLifeTime, ShotTypeStandard, 0);
bolt->setDamages(fireDamages);
bolt->setFlying(isFairyTransmuted);
float shotAngle = rand() % 360;
bolt->setVelocity(Vector2D(fireVelocity * 0.75f * cos(shotAngle), fireVelocity * 0.75f * sin(shotAngle)));
randomFireDelay = fireDelay * 1.5f;
}
canFirePlayer = false;
currentFireDelay = fireDelay;
if (needInitShotType) initShotType();
}
}
bool PlayerEntity::canMove()
{
return (playerStatus == playerStatusPlaying
|| (playerStatus == playerStatusAcquire && statusTimer < ACQUIRE_DELAY / 2));
}
int PlayerEntity::hurt(StructHurt hurtParam)
{
if (playerStatus == playerStatusDead) return false;
bool divinityInvoked = false;
if (hp - hurtParam.damage <= hpMax / 4 && divinity.divinity >= 0)
{
divinityInvoked = triggerDivinityBefore();
if (divinityInvoked)
game().testAndAddMessageToQueue((EnumMessages)(MsgInfoDivIntervention));
}
if (invincibleDelay <= 0.0f || hurtParam.hurtingType == ShotTypeDeterministic)
{
SoundManager::getInstance().playSound(SOUND_PLAYER_HIT);
int oldHp = hp;
if (BaseCreatureEntity::hurt(hurtParam) > 0)
{
if (hurtParam.hurtingType != ShotTypeDeterministic)
{
invincibleDelay = INVINCIBLE_DELAY;
if (equip[EQUIP_RAGE_AMULET]) rageFire();
game().generateBlood(x, y, bloodColor);
}
hurtingDelay = HURTING_DELAY * 2.0f;
game().generateBlood(x, y, bloodColor);
game().proceedEvent(EventBeingHurted);
lastHurtingEnemy = hurtParam.enemyType;
lastHurtingSource = hurtParam.sourceType;
// divinity
offerHealth(oldHp - hp);
if (!divinityInvoked && hp <= hpMax / 4 && divinity.divinity >= 0)
{
triggerDivinityAfter();
}
return true;
}
}
return false;
}
void PlayerEntity::setMap(GameMap* map, int tileWidth, int tileHeight, int offsetX, int offsetY)
{
CollidingSpriteEntity::setMap(map, tileWidth, tileHeight, offsetX, offsetY);
//if (slimePet != NULL) slimePet->setMap(map, tileWidth, tileHeight, offsetX, offsetY);
}
void PlayerEntity::loseItem(enumItemType itemType, bool isEquip)
{
CollidingSpriteEntity* itemSprite
= new CollidingSpriteEntity(ImageManager::getInstance().getImage(isEquip ? IMAGE_ITEMS_EQUIP : IMAGE_ITEMS), x, y, 32, 32);
itemSprite->setMap(map, TILE_WIDTH, TILE_HEIGHT, 0, 0);
itemSprite->setZ(-1);
itemSprite->setFrame(itemType);
itemSprite->setImagesProLine(10);
itemSprite->setType(ENTITY_BLOOD);
itemSprite->setVelocity(Vector2D(200 + rand()%450));
itemSprite->setViscosity(0.95f);
itemSprite->setSpin( (rand() % 700) - 350.0f);
}
void PlayerEntity::dying()
{
if (divinity.divinity > -1 && divinity.interventions < divinity.level - 1)
{
hp = 1;
return;
}
playerStatus = playerStatusDead;
deathAge = 0.0f;
hp = 0;
SoundManager::getInstance().playSound(SOUND_PLAYER_DIE);
setVelocity(Vector2D(0.0f, 0.0f));
int i;
for (i = 0; i < gold && i < 10; i++) loseItem(ItemCopperCoin, false);
for (i = 0; i < 5; i++) game().generateBlood(x, y, BloodRed);
for (i = 0; i < NUMBER_EQUIP_ITEMS; i++)
{
if (equip[i])
{
if (items[i + FirstEquipItem].familiar == FamiliarNone)
loseItem(enumItemType(i), true);
}
}
remove(SAVE_FILE.c_str());
game().calculateScore();
}
void PlayerEntity::displayAcquiredGold(int n)
{
std::ostringstream oss;
if (n > 0) oss << "+";
oss << n;
TextEntity* text = new TextEntity(oss.str(), 16, x, y - 30.0f);
text->setColor(TextEntity::COLOR_FADING_YELLOW);
text->setAge(-0.6f);
text->setLifetime(0.3f);
text->setWeight(-60.0f);
text->setZ(2000);
text->setAlignment(ALIGN_CENTER);
text->setType(ENTITY_FLYING_TEXT);
}
void PlayerEntity::acquireItem(enumItemType type)
{
if (items[type].generatesStance) acquireStance(type);
else switch (type)
{
case ItemCopperCoin:
gold++;
displayAcquiredGold(1);
SoundManager::getInstance().playSound(SOUND_COIN_PICK_UP);
game().proceedEvent(EventGetCoin);
break;
case ItemSilverCoin:
gold = gold + 5;
displayAcquiredGold(5);
SoundManager::getInstance().playSound(SOUND_COIN_PICK_UP);
game().proceedEvent(EventGetCoin);
break;
case ItemGoldCoin:
gold = gold + 10;
displayAcquiredGold(10);
SoundManager::getInstance().playSound(SOUND_COIN_PICK_UP);
break;
case ItemHealthVerySmallPoison:
specialState[SpecialStatePoison].active = false;
case ItemHealthVerySmall:
heal(equip[EQUIP_MANUAL_HEALTH] ? 5 : 3);
SoundManager::getInstance().playSound(SOUND_EAT);
break;
case ItemHealthSmall:
heal(equip[EQUIP_MANUAL_HEALTH] ? 10 : 7);
SoundManager::getInstance().playSound(SOUND_EAT);
break;
case ItemHealth:
heal(equip[EQUIP_MANUAL_HEALTH] ? 22 : 15);
SoundManager::getInstance().playSound(SOUND_EAT);
break;
default:
break;
}
}
void PlayerEntity::onClearRoom()
{
if (divinity.divinity == DivinityHealer)
{
if (divinity.level > 1 && hp < hpMax)
{
divineInterventionDelay = WORSHIP_DELAY / 2;
isRegeneration = true;
if (divinity.level >= 5) heal(4);
else if (divinity.level >= 4) heal(3);
else if (divinity.level >= 3) heal(2);
else if (divinity.level >= 2) heal(1);
}
}
}
void PlayerEntity::computePlayer()
{
float boltLifeTimeBonus = 1.0f;
float fireDelayBonus = 1.0f;
float creatureSpeedBonus = 1.0f;
float fireVelocityBonus = 1.0f;
float fireDamagesBonus = 1.0f;
armor = 0.0f;
criticalChance = 0;
for (int i = 0; i < NB_RESISTANCES; i++)
resistance[i] = ResistanceStandard;
- if (equip[EQUIP_DISPLACEMENT_GLOVES]) fireDelayBonus -= 0.10f;
+ if (equip[EQUIP_GLOVES_ADVANCED]) fireDelayBonus -= 0.15f;
+ else if (equip[EQUIP_DISPLACEMENT_GLOVES]) fireDelayBonus -= 0.10f;
if (equip[EQUIP_HAT_ADVANCED]) fireDelayBonus -= 0.3f;
else if (equip[EQUIP_MAGICIAN_HAT]) fireDelayBonus -= 0.2f;
if (equip[EQUIP_LEATHER_BELT]) fireDelayBonus -= 0.15f;
- if (equip[EQUIP_LEATHER_BOOTS]) creatureSpeedBonus += 0.15f;
+ if (equip[EQUIP_BOOTS_ADVANCED]) creatureSpeedBonus += 0.25f;
+ else if (equip[EQUIP_LEATHER_BOOTS]) creatureSpeedBonus += 0.15f;
if (equip[EQUIP_BOOK_TRIPLE]) fireDelayBonus += 0.7f;
else if (equip[EQUIP_BOOK_DUAL]) fireDelayBonus += 0.5f;
if (equip[EQUIP_CRITICAL_ADVANCED]) criticalChance += 5;
if (equip[EQUIP_MANUAL_STAFF]) boltLifeTimeBonus += 0.4f;
if (equip[EQUIP_MAHOGANY_STAFF])
{
fireVelocityBonus += 0.15f;
fireDamagesBonus += 0.5f;
}
if (equip[EQUIP_BLOOD_SNAKE]) fireDamagesBonus += 0.5f;
if (equip[EQUIP_ROBE_ADVANCED]) armor += 0.2f;
else if (equip[EQUIP_MAGICIAN_ROBE]) armor += 0.15f;
// divinity
switch (divinity.divinity)
{
case (DivinityHealer):
{
break;
}
case (DivinityFighter):
{
if (divinity.level >= 5)
fireDamagesBonus += 0.5f;
else if (divinity.level >= 4)
fireDamagesBonus += 0.375f;
else if (divinity.level >= 3)
fireDamagesBonus += 0.25f;
else if (divinity.level >= 2)
fireDamagesBonus += 0.125f;
break;
}
case (DivinityIce):
{
if (divinity.level >= 5) resistance[ResistanceFrozen] = ResistanceVeryHigh;
if (divinity.level >= 3) resistance[ResistanceIce] = ResistanceHigh;
break;
}
case (DivinityStone):
{
if (divinity.level >= 5) resistance[ResistanceRecoil] = ResistanceVeryHigh;
if (divinity.level >= 3) resistance[ResistanceStone] = ResistanceHigh;
break;
}
}
fireDelay = INITIAL_PLAYER_FIRE_DELAY * fireDelayBonus;
creatureSpeed = INITIAL_PLAYER_SPEED * creatureSpeedBonus;
fireVelocity = INITIAL_BOLT_VELOCITY * fireVelocityBonus;
fireDamages = INITIAL_BOLT_DAMAGES * fireDamagesBonus;
boltLifeTime = INITIAL_BOLT_LIFE * boltLifeTimeBonus;
// gems
for (int i = 1; i < SPECIAL_SHOT_SLOTS; i++)
{
specialShotLevel[i] = 0;
switch (specialShots[i])
{
case ShotTypeIce:
if (equip[EQUIP_RING_ICE]) specialShotLevel[i]++;
if (divinity.divinity == DivinityIce && divinity.level >= 4) specialShotLevel[i]++;
break;
case ShotTypeStone:
if (equip[EQUIP_RING_STONE]) specialShotLevel[i]++;
if (divinity.divinity == DivinityStone && divinity.level >= 4) specialShotLevel[i]++;
break;
case ShotTypeLightning:
if (equip[EQUIP_RING_LIGHTNING]) specialShotLevel[i]++;
break;
case ShotTypeIllusion:
if (equip[EQUIP_RING_ILLUSION]) specialShotLevel[i]++;
break;
case ShotTypeFire:
if (equip[EQUIP_RING_FIRE]) specialShotLevel[i]++;
break;
case ShotTypePoison:
if (equip[EQUIP_RING_POISON]) specialShotLevel[i]++;
break;
default:
break;
}
}
if (getShotType() == ShotTypeIllusion) fireDamages *= ILLUSION_DAMAGE_DECREASE[getShotLevel()];
else if (getShotType() == ShotTypeFire) fireDamages *= FIRE_DAMAGE_INCREASE[getShotLevel()];
// divinity
if (specialState[DivineStateProtection].active)
armor += specialState[DivineStateProtection].param1;
// post-computation
if (equip[EQUIP_BOOK_TRIPLE_QUICK]) fireDamages *= 0.65f;
else if (equip[EQUIP_BOOK_DUAL_QUICK]) fireDamages *= 0.75f;
else if (equip[EQUIP_RAPID_SHOT])
{
fireDelay *= 0.20f;
fireDamages *= 0.25f;
}
if (equip[EQUIP_ALCOHOL]) fireDamages *= 1.25f;
// spells
if (protection.active) armor += protection.value;
if (armor > 1.0f) armor = 1.0f;
// fairy ?
if (isFairyTransmuted)
{
fireDamages *= 0.5f;
creatureSpeed *= 1.5f;
movingStyle = movFlying;
}
else
{
movingStyle = movWalking;
}
}
void PlayerEntity::acquireStance(enumItemType type)
{
velocity.x = 0.0f;
velocity.y = 0.0f;
playerStatus = playerStatusAcquire;
statusTimer = ACQUIRE_DELAY;
acquiredItem = (enumItemType)(type);
SoundManager::getInstance().playSound(SOUND_BONUS);
game().showArtefactDescription(type);
enumItemType itemFrame = type;
int itemImage = IMAGE_ITEMS;
if (itemFrame >= FirstEquipItem)
{
itemFrame = (enumItemType)(itemFrame - FirstEquipItem);
itemImage = IMAGE_ITEMS_EQUIP;
}
spriteItem = new SpriteEntity(
ImageManager::getInstance().getImage(itemImage),
x, y - 100.0f, ITEM_WIDTH, ITEM_HEIGHT);
spriteItem->setFrame((int)itemFrame);
spriteItem->setImagesProLine(10);
spriteItem->setZ(z);
spriteItem->setLifetime(ACQUIRE_DELAY);
spriteItemStar = new SpriteEntity(
ImageManager::getInstance().getImage(IMAGE_STAR),
x, y - 100.0f);
spriteItemStar->setScale(4.0f, 4.0f);
spriteItemStar->setZ(z-1.0f);
spriteItemStar->setLifetime(ACQUIRE_DELAY);
spriteItemStar->setSpin(50.0f);
}
void PlayerEntity::collideMapRight()
{
collidingDirection = 6;
if (recoil.active) recoil.velocity.x = -recoil.velocity.x * 0.7f;
}
void PlayerEntity::collideMapLeft()
{
collidingDirection = 4;
if (recoil.active) recoil.velocity.x = -recoil.velocity.x * 0.7f;
}
void PlayerEntity::collideMapTop()
{
collidingDirection = 8;
if (recoil.active) recoil.velocity.y= -recoil.velocity.y * 0.7f;
}
void PlayerEntity::collideMapBottom()
{
collidingDirection = 2;
if (recoil.active) recoil.velocity.y= -recoil.velocity.y * 0.7f;
}
void PlayerEntity::useBossKey()
{
velocity.x = 0.0f;
velocity.y = 0.0f;
playerStatus = playerStatusUnlocking;
statusTimer = UNLOCK_DELAY;
acquiredItem = (enumItemType)(type - FirstEquipItem);
SoundManager::getInstance().playSound(SOUND_DOOR_OPENING_BOSS);
equip[EQUIP_BOSS_KEY] = false;
SpriteEntity* spriteItem = new SpriteEntity(
ImageManager::getInstance().getImage(IMAGE_ITEMS_EQUIP),
x, y - 80.0f, ITEM_WIDTH, ITEM_HEIGHT);
spriteItem->setFrame(EQUIP_BOSS_KEY);
spriteItem->setZ(z);
spriteItem->setAge(-UNLOCK_DELAY * 0.5f);
spriteItem->setLifetime(UNLOCK_DELAY * 0.5f);
spriteItem->setFading(true);
spriteItem->setSpin(300);
}
enumShotType PlayerEntity::getShotType()
{
return specialShots[specialShotIndex];
}
int PlayerEntity::getShotIndex()
{
return specialShotIndex;
}
void PlayerEntity::setShotIndex(int index)
{
specialShotIndex = index;
}
enumShotType PlayerEntity::getShotType(int slot)
{
return specialShots[slot];
}
void PlayerEntity::setShotType(int slot, enumShotType shotType)
{
specialShots[slot] = shotType;
}
void PlayerEntity::registerSpecialShot(int item)
{
bool found = false;
int index = 1;
while (index < SPECIAL_SHOT_SLOTS && !found)
{
found = specialShots[index] == ShotTypeStandard;
if (!found) index++;
}
if (found)
{
this->specialShots[index] = items[item].specialShot;
specialShotIndex = index;
initShotType();
}
}
void PlayerEntity::selectNextShotType()
{
int index = specialShotIndex + 1;
bool found = false;
while (index < SPECIAL_SHOT_SLOTS && !found)
{
if (specialShots[index] == ShotTypeStandard) index++;
else found = true;
}
if (found)
{
specialShotIndex = index;
initShotType();
}
else
specialShotIndex = 0;
SoundManager::getInstance().playSound(SOUND_SHOT_SELECT);
computePlayer();
}
void PlayerEntity::initShotType()
{
specialBoltTimer = STATUS_FROZEN_BOLT_DELAY[getShotLevel()];
needInitShotType = false;
if (getShotType() == ShotTypeLightning)
SoundManager::getInstance().playSound(SOUND_ELECTRIC_CHARGE);
}
unsigned int PlayerEntity::getShotLevel()
{
return specialShotLevel[specialShotIndex];
}
unsigned int PlayerEntity::getShotLevel(int index)
{
return specialShotLevel[index];
}
int PlayerEntity::getFairieNumber()
{
return fairies.size();
}
FairyEntity* PlayerEntity::getFairy(unsigned int n)
{
if (n < fairies.size())
return fairies[n];
else
return NULL;
}
bool PlayerEntity::canGetNewShot(bool advancedShot)
{
int nbSpecial =0;
int nbAdvanced =0;
for (int i = 1; i < SPECIAL_SHOT_SLOTS; i++)
{
switch (specialShots[i])
{
case ShotTypeIce:
case ShotTypeStone:
case ShotTypeLightning:
nbSpecial++;
break;
case ShotTypeFire:
case ShotTypeIllusion:
case ShotTypePoison:
nbAdvanced++;
break;
case ShotTypeStandard:
break;
default:
std::cout << "[WARNING] Can not register shot type: " << getShotType() << std::endl;
}
}
if (advancedShot)
return (nbAdvanced >= SPECIAL_SHOT_SLOTS_ADVANCED);
else
return (nbSpecial >= SPECIAL_SHOT_SLOTS_STANDARD);
}
void PlayerEntity::interact(EnumInteractionType interaction, int id)
{
if (playerStatus == playerStatusPlaying)
{
// praying at the temple
if (interaction == InteractionTypeTemple)
{
if (divinity.divinity == id)
{
// donation
if (gold >= 10)
{
donate(10);
}
}
else
{
worship((enumDivinityType)id);
}
}
else if (interaction == InteractionTypeMerchandise)
{
if (itemToBuy != NULL) itemToBuy->buy();
}
}
}
float PlayerEntity::getBolPositionY()
{
if (isFairyTransmuted)
return y - 25;
else
return y - 20;
}
// DIVINITY
void PlayerEntity::donate(int n)
{
if (gold >= n)
{
gold -= n;
displayAcquiredGold(-n);
SoundManager::getInstance().playSound(SOUND_PAY);
// standard : 1 gold = 3 piety
int pietyProGold = 3;
if (divinity.divinity == DivinityHealer)
pietyProGold = 5;
addPiety(pietyProGold * n);
// check item invoke
bool divineGift = false;
enumItemType itemType = ItemCopperCoin;
if (divinity.level >= 3 && game().getItemsCount() == 0)
{
if (divinity.divinity == DivinityHealer && !equip[EQUIP_MANUAL_HEALTH])
{
// Healer + level 3 = Health manual
divineGift = true;
itemType = ItemManualHealth;
}
else if (divinity.divinity == DivinityIce && !equip[EQUIP_GEM_ICE])
{
divineGift = true;
itemType = ItemGemIce;
}
else if (divinity.divinity == DivinityStone && !equip[EQUIP_GEM_STONE])
{
divineGift = true;
itemType = ItemGemStone;
}
}
if (divineGift)
{
float xItem = GAME_WIDTH / 2;
float yItem = GAME_HEIGHT * 0.8f;
new ItemEntity(itemType, xItem, yItem);
SoundManager::getInstance().playSound(SOUND_OM);
divineInterventionDelay = WORSHIP_DELAY / 2;
isRegeneration = false;
for (int i = 0; i < 8; i++)
{
game().generateStar(sf::Color::White, xItem, yItem);
game().generateStar(sf::Color(255, 255, 210), xItem, yItem);
}
game().testAndAddMessageToQueue((EnumMessages)(MsgInfoDivGift));
}
}
}
void PlayerEntity::offerMonster(enemyTypeEnum monster, enumShotType hurtingType)
{
if (divinity.divinity > -1)
{
// standard : 1 monster = 2 piety - 1 boss = 20 piety
int pietyProMonster = 2;
int pietyProBoss = 20;
switch (divinity.divinity)
{
case DivinityHealer:
if (monster == EnemyTypeGhost
|| monster == EnemyTypeZombie
|| monster == EnemyTypeZombieDark
|| monster == EnemyTypeImpBlue
|| monster == EnemyTypeImpRed
|| monster == EnemyTypeWitch
|| monster == EnemyTypeWitchRed)
pietyProMonster = 4;
else
pietyProMonster = 0;
break;
case DivinityFighter:
pietyProMonster = 3;
pietyProBoss = 30;
break;
case DivinityIce:
if (monster == EnemyTypeSlimeRed
|| monster == EnemyTypeImpRed
|| monster == EnemyTypeEvilFlowerFire)
pietyProMonster = 4;
if (hurtingType == ShotTypeCold || hurtingType == ShotTypeIce)
{
pietyProMonster *= 1.5f;
pietyProBoss = 25;
}
break;
case DivinityStone:
if (hurtingType == ShotTypeCold || hurtingType == ShotTypeIce)
{
pietyProMonster = 3;
pietyProBoss = 30;
}
else
{
pietyProBoss = 25;
}
break;
}
if (monster < EnemyTypeButcher) // normal or mini-boss
{
addPiety(pietyProMonster);
}
else if (monster < EnemyTypeBat_invocated) // boss
{
addPiety(pietyProBoss);
}
}
}
void PlayerEntity::offerHealth(int lostHp)
{
if (divinity.divinity == DivinityHealer)
{
addPiety(lostHp * 2.5f);
}
}
void PlayerEntity::offerChallenge()
{
if (divinity.divinity >= 0)
addPiety(30);
}
void PlayerEntity::divineFury()
{
enumShotType shotType = ShotTypeStandard;
if (divinity.divinity == DivinityIce) shotType = ShotTypeIce;
else if (divinity.divinity == DivinityStone) shotType = ShotTypeStone;
int multBonus = 6;
if (divinity.divinity == DivinityFighter) multBonus = 8;
for (float i = 0.0f; i < 2 * PI; i += PI / 16)
{
BoltEntity* bolt = new BoltEntity(TILE_WIDTH * 1.5f + rand() % (MAP_WIDTH - 3) * TILE_WIDTH ,
TILE_HEIGHT * 1.5f + rand() % (MAP_HEIGHT - 3) * TILE_HEIGHT,
boltLifeTime, shotType, 0);
bolt->setDamages(8 + divinity.level * multBonus);
float velx = 400 * cos(i);
float vely = 400 * sin(i);
bolt->setVelocity(Vector2D(velx, vely));
bolt->setFlying(true);
bolt->setViscosity(1.0f);
bolt->setLifetime(-1.0f);
bolt->setGoThrough(true);
bolt->setFromPlayer(false);
}
}
void PlayerEntity::divineIce()
{
EntityManager::EntityList* entityList = EntityManager::getInstance().getList();
EntityManager::EntityList::iterator it;
for (it = entityList->begin (); it != entityList->end ();)
{
GameEntity *e = *it;
it++;
if (e->getType() >= ENTITY_ENEMY && e->getType() <= ENTITY_ENEMY_MAX)
{
EnemyEntity* enemy = dynamic_cast<EnemyEntity*>(e);
enemy->setSpecialState(SpecialStateIce, true, 10.0f, 0.1f, 0.0f);
}
}
}
void PlayerEntity::divineRepulse()
{
EntityManager::EntityList* entityList = EntityManager::getInstance().getList();
EntityManager::EntityList::iterator it;
for (it = entityList->begin (); it != entityList->end ();)
{
GameEntity *e = *it;
it++;
if (e->getType() >= ENTITY_ENEMY && e->getType() <= ENTITY_ENEMY_MAX)
{
EnemyEntity* enemy = dynamic_cast<EnemyEntity*>(e);
enemy->giveRecoil(true, Vector2D(x, y).vectorTo(Vector2D(enemy->getX(), enemy->getY()), 700.0f), 2.0f);
}
}
// effect
for (int i = 0; i < 40; i++)
{
SpriteEntity* spriteRock = new SpriteEntity(
ImageManager::getInstance().getImage(IMAGE_CYCLOP),
x, y, 64, 64);
spriteRock->setZ(1000.0f);
spriteRock->setImagesProLine(20);
spriteRock->setFrame(rand() % 2 == 0 ? 38 : 58);
spriteRock->setSpin(-100 + rand()%200);
spriteRock->setVelocity(Vector2D(400 + rand()%400));
spriteRock->setFading(true);
spriteRock->setAge(-0.8f);
spriteRock->setLifetime(2.0f);
spriteRock->setType(ENTITY_EFFECT);
}
game().makeShake(1.0f);
SoundManager::getInstance().playSound(SOUND_EARTHQUAKE);
}
void PlayerEntity::divineProtection(float duration, float armorBonus)
{
setSpecialState(DivineStateProtection, true, 4.0f, 0.8f, 0.0f);
}
void PlayerEntity::divineHeal(int hpHealed)
{
hp += hpHealed;
if (hp > hpMax) hp = hpMax;
specialState[SpecialStatePoison].active = false;
divineInterventionDelay = WORSHIP_DELAY;
isRegeneration = false;
}
bool PlayerEntity::triggerDivinityBefore()
{
if (divinity.divinity > -1 && divinity.interventions < divinity.level - 1)
{
switch (divinity.divinity)
{
case DivinityHealer:
{
break;
}
case DivinityFighter:
{
int r = rand() % 3;
if (r == 0) return false;
SoundManager::getInstance().playSound(SOUND_OM);
divinity.interventions ++;
divineHeal(hpMax / 3);
if (r == 1) divineProtection(5.0f, 0.8f);
else divineFury();
game().makeColorEffect(X_GAME_COLOR_RED, 0.45f);
return true;
break;
}
case DivinityIce:
{
int r = rand() % 3;
if (r == 0) return false;
SoundManager::getInstance().playSound(SOUND_OM);
divinity.interventions ++;
divineHeal(hpMax / 3);
if (r == 1)
{
divineIce();
game().makeColorEffect(X_GAME_COLOR_BLUE, 7.5f);
}
else
{
divineFury();
game().makeColorEffect(X_GAME_COLOR_BLUE, 0.5f);
}
return true;
break;
}
case DivinityStone:
{
int r = rand() % 3;
r = 1;
divineProtection(10.0f, 0.5f);
if (r == 0) return false;
SoundManager::getInstance().playSound(SOUND_OM);
divinity.interventions ++;
divineHeal(hpMax / 3);
if (r == 1)
{
divineRepulse();
game().makeColorEffect(X_GAME_COLOR_BROWN, 3.0f);
}
else
{
divineFury();
game().makeColorEffect(X_GAME_COLOR_BROWN, 0.5f);
}
return true;
break;
}
}
}
return false;
}
void PlayerEntity::triggerDivinityAfter()
{
if (divinity.divinity > -1 && divinity.interventions < divinity.level - 1)
{
switch (divinity.divinity)
{
case DivinityHealer:
{
SoundManager::getInstance().playSound(SOUND_OM);
divinity.interventions ++;
divineHeal(hpMax);
break;
}
case DivinityFighter:
{
SoundManager::getInstance().playSound(SOUND_OM);
divinity.interventions ++;
divineHeal(hpMax / 2);
break;
}
}
game().testAndAddMessageToQueue((EnumMessages)(MsgInfoDivIntervention));
}
}
void PlayerEntity::addPiety(int n)
{
if (equip[EQUIP_BOOK_PRAYER_I]) n *= 1.5f;
int oldLevel = divinity.level;
divinity.piety += n;
if (divinity.piety >= DIVINITY_LEVEL_TRESHOLD[MAX_DIVINITY_LEVEL - 1])
{
divinity.piety = DIVINITY_LEVEL_TRESHOLD[MAX_DIVINITY_LEVEL - 1];
divinity.percentsToNextLevels = 1.0f;
game().registerAchievement(AchievementPietyMax);
divinity.level = MAX_DIVINITY_LEVEL + 1;
}
else
{
int i = 0;
while (divinity.piety > DIVINITY_LEVEL_TRESHOLD[i] && i < (MAX_DIVINITY_LEVEL + 1)) i++;
divinity.level = i + 1;
if (divinity.level == 1)
divinity.percentsToNextLevels = (float)divinity.piety / (float)DIVINITY_LEVEL_TRESHOLD[0];
else
divinity.percentsToNextLevels
= (float)(divinity.piety - DIVINITY_LEVEL_TRESHOLD[divinity.level - 2])
/ (float)(DIVINITY_LEVEL_TRESHOLD[divinity.level - 1] - DIVINITY_LEVEL_TRESHOLD[divinity.level - 2]);
}
if (divinity.level > oldLevel)
{
SoundManager::getInstance().playSound(SOUND_OM);
divineInterventionDelay = WORSHIP_DELAY / 2;
isRegeneration = false;
computePlayer();
}
}
void PlayerEntity::worship(enumDivinityType id)
{
int oldPiety = divinity.piety;
bool isReconversion = divinity.divinity > -1;
playerStatus = playerStatusPraying;
statusTimer = WORSHIP_DELAY;
SoundManager::getInstance().playSound(SOUND_OM);
divinity.divinity = id;
divinity.piety = 0;
divinity.level = 1;
divinity.percentsToNextLevels = 0.0f;
facingDirection = 2;
// text
float x0 = MAP_WIDTH * 0.5f * TILE_WIDTH;
float y0 = MAP_HEIGHT * 0.5f * TILE_HEIGHT + 140.0f;
std::stringstream ss;
ss << tools::getLabel("worshipping") << " ";
ss << tools::getLabel(divinityLabel[divinity.divinity] + "_0");
TextEntity* text = new TextEntity(ss.str(), 24, x0, y0);
text->setAlignment(ALIGN_CENTER);
text->setLifetime(2.5f);
text->setWeight(-36.0f);
text->setZ(1200);
text->setColor(TextEntity::COLOR_FADING_WHITE);
// reconversion
if (isReconversion)
{
addPiety((equip[EQUIP_BOOK_PRAYER_I]) ? 0.66 * oldPiety : 0.5 * oldPiety);
if (divinity.interventions > divinity.level - 1)
divinity.interventions = divinity.level - 1;
}
else
divinity.interventions = 0;
// message
game().testAndAddMessageToQueue((EnumMessages)(MsgInfoDivHealer + (int)id));
}
void PlayerEntity::loadDivinity(int id, int piety, int level, int interventions)
{
divinity.divinity = id;
divinity.piety = piety;
divinity.level = level;
divinity.interventions = interventions;
if (id >= 0) addPiety(0);
}
// MAGIC
castSpellStruct PlayerEntity::getActiveSpell()
{
return activeSpell;
}
void PlayerEntity::setActiveSpell(enumCastSpell spell, bool fromSaveInFight)
{
if (activeSpell.spell != SpellNone)
{
// drop the old spell
equip[activeSpell.frame] = false;
ItemEntity* newItem = new ItemEntity((enumItemType)(ItemMagicianHat + activeSpell.frame), x, y);
newItem->setVelocity(Vector2D(100.0f + rand()% 250));
newItem->setViscosity(0.96f);
}
activeSpell.spell = spell;
switch (spell)
{
case SpellTeleport:
activeSpell.delayMax = 20.0f;
activeSpell.frame = ItemSpellTeleport - FirstEquipItem;
break;
case SpellSlimeExplode:
activeSpell.delayMax = 40.0f;
activeSpell.frame = ItemSpellSlimeExplode - FirstEquipItem;
break;
case SpellFireball:
activeSpell.delayMax = 20.0f;
activeSpell.frame = ItemSpellFireball - FirstEquipItem;
break;
case SpellFreeze:
activeSpell.delayMax = 40.0f;
activeSpell.frame = ItemSpellFreeze - FirstEquipItem;
break;
case SpellEarthquake:
activeSpell.delayMax = 40.0f;
activeSpell.frame = ItemSpellEarthquake - FirstEquipItem;
break;
case SpellProtection:
activeSpell.delayMax = 40.0f;
activeSpell.frame = ItemSpellProtection - FirstEquipItem;
break;
case SpellWeb:
activeSpell.delayMax = 35.0f;
activeSpell.frame = ItemSpellWeb - FirstEquipItem;
break;
case SpellFlower:
activeSpell.delayMax = 80.0f;
activeSpell.frame = ItemSpellFlower - FirstEquipItem;
break;
case SpellFairy:
activeSpell.delayMax = 10.0f;
activeSpell.frame = ItemSpellFairy - FirstEquipItem;
break;
case SpellNone:
break;
}
if (fromSaveInFight) activeSpell.delay = 1.0f;
else activeSpell.delay = activeSpell.delayMax;
}
void PlayerEntity::castSpell()
{
if (playerStatus != playerStatusPlaying) return;
if (canCastSpell())
{
activeSpell.delay = equip[EQUIP_BOOK_MAGIC_I] ? activeSpell.delayMax * 0.8f : activeSpell.delayMax;
switch (activeSpell.spell)
{
case SpellTeleport:
castTeleport();
break;
case SpellSlimeExplode:
castSummonsSlimeExplode();
break;
case SpellFireball:
castFireball();
break;
case SpellFreeze:
spellAnimationDelay = spellAnimationDelayMax;
castFreeze();
break;
case SpellEarthquake:
spellAnimationDelay = spellAnimationDelayMax;
castEarthquake();
break;
case SpellProtection:
spellAnimationDelay = spellAnimationDelayMax;
castProtection();
break;
case SpellWeb:
castWeb();
break;
case SpellFlower:
spellAnimationDelay = spellAnimationDelayMax;
castSummonsFlower();
break;
case SpellFairy:
castTransmuteFairy();
break;
case SpellNone:
break;
}
}
}
bool PlayerEntity::canCastSpell()
{
return activeSpell.spell != SpellNone && activeSpell.delay <= 0.0f;
}
void PlayerEntity::castTeleport()
{
bool ok = false;
int xm, ym;
float xNew = x, yNew = y;
invincibleDelay = equip[EQUIP_BOOK_MAGIC_II] ? 2.5f : 2.0f;
SoundManager::getInstance().playSound(SOUND_TELEPORT);
game().makeColorEffect(X_GAME_COLOR_VIOLET, 0.3f);
for(int i=0; i < 6; i++)
{
generateStar(sf::Color(50, 50, 255, 255));
generateStar(sf::Color(200, 200, 255, 255));
}
int counter = 150;
while (!ok && counter > 0)
{
counter--;
int distanceMin = 20000;
if (counter < 50) distanceMin = 30000;
else if (counter < 100) distanceMin = 25000;
xm = 1 +rand() % (MAP_WIDTH - 3);
ym = 1 +rand() % (MAP_HEIGHT - 3);
if (game().getCurrentMap()->isWalkable(xm, ym))
{
// enemy or bolt ?
EntityManager::EntityList* entityList =EntityManager::getInstance().getList();
EntityManager::EntityList::iterator it;
bool isBad = false;
xNew = xm * TILE_WIDTH + TILE_WIDTH * 0.5f;
yNew = ym * TILE_HEIGHT+ TILE_HEIGHT * 0.5f;
for (it = entityList->begin (); !isBad && it != entityList->end ();)
{
GameEntity *e = *it;
it++;
if ((e->getType() >= ENTITY_ENEMY && e->getType() <= ENTITY_ENEMY_MAX_COUNT) || e->getType() == ENTITY_ENEMY_BOLT)
isBad = Vector2D(xNew, yNew).distance2(Vector2D(e->getX(), e->getY())) < distanceMin;
}
if (!isBad)
{
x = xNew;
y = yNew;
}
}
}
for(int i=0; i < 6; i++)
{
generateStar(sf::Color(50, 50, 255, 255));
generateStar(sf::Color(200, 200, 255, 255));
}
}
void PlayerEntity::initFallingGrid()
{
for (int i = 0; i < MAP_WIDTH; i++)
for (int j = 0; j < MAP_HEIGHT; j++)
fallingGrid[i][j] = false;
}
void PlayerEntity::fallRock()
{
int rx, ry;
do
{
rx = 1 + rand() % (MAP_WIDTH - 2);
ry = 1 + rand() % (MAP_HEIGHT - 2);
}
while (fallingGrid[rx][ry]);
fallingGrid[rx][ry] = true;
new FallingRockEntity(rx * TILE_WIDTH + TILE_WIDTH / 2,
ry * TILE_HEIGHT + TILE_HEIGHT / 2,
rand() % 3,
true);
}
void PlayerEntity::castSummonsSlimeExplode()
{
SlimeEntity* slime = new SlimeEntity( ((int)(x) / TILE_WIDTH) * TILE_WIDTH + TILE_WIDTH * 0.5f,
y - 5, SlimeTypeViolet, true);
slime->makePet(facingDirection);
game().makeColorEffect(X_GAME_COLOR_VIOLET, 0.3f);
}
void PlayerEntity::castFireball()
{
SoundManager::getInstance().playSound(SOUND_FIREBALL);
game().makeColorEffect(X_GAME_COLOR_RED, 0.3f);
enumShotType boltType = ShotTypeFire;
unsigned int shotLevel = 2;
BoltEntity* bolt = new BoltEntity(x, getBolPositionY(), boltLifeTime + 0.5f, boltType, shotLevel);
int boltDamage = fireDamages * (equip[EQUIP_BOOK_MAGIC_II] ? 4 : 3);
if (equip[EQUIP_BOOK_MAGIC_II] && boltDamage < 16) boltDamage = 16;
else if (!equip[EQUIP_BOOK_MAGIC_II] && boltDamage < 12) boltDamage = 12;
bolt->setDamages(boltDamage);
bolt->setGoThrough(true);
float velx = 0.0f, vely = 0.0f;
if (facingDirection == 4) velx = -fireVelocity;
else if (facingDirection == 8) vely = -fireVelocity;
else if (facingDirection == 2) vely = fireVelocity;
else velx = fireVelocity;
bolt->setVelocity(Vector2D(velx, vely));
}
void PlayerEntity::castFreeze()
{
int iceLevel = equip[EQUIP_BOOK_MAGIC_II] ? 2 : 1;
for (float i = 0.0f; i < 2 * PI; i += PI / 8)
{
BoltEntity* bolt1 = new BoltEntity(x, getBolPositionY(), boltLifeTime, ShotTypeIce, iceLevel);
bolt1->setDamages(1);
float velx = fireVelocity * cos(i);
float vely = fireVelocity * sin(i);
bolt1->setVelocity(Vector2D(velx, vely));
}
game().makeColorEffect(X_GAME_COLOR_BLUE, 0.3f);
SoundManager::getInstance().playSound(SOUND_SPELL_FREEZE);
}
void PlayerEntity::castEarthquake()
{
initFallingGrid();
int nbIterations = equip[EQUIP_BOOK_MAGIC_II] ? 24 : 22;
for (int i = 0; i < nbIterations; i++) fallRock();
game().makeShake(0.25f);
game().makeColorEffect(X_GAME_COLOR_BROWN, 0.3f);
SoundManager::getInstance().playSound(SOUND_EARTHQUAKE);
}
void PlayerEntity::castProtection()
{
protection.active = true;
protection.value = equip[EQUIP_BOOK_MAGIC_II] ? 0.6f : 0.4f;
protection.timer = 10.0f;
computePlayer();
game().makeColorEffect(X_GAME_COLOR_BLUE, 0.3f);
SoundManager::getInstance().playSound(SOUND_SPELL_SHIELD);
}
void PlayerEntity::castWeb()
{
SoundManager::getInstance().playSound(SOUND_SPIDER_WEB);
int nbWeb = equip[EQUIP_BOOK_MAGIC_II] ? 4 : 3;
for (int i = 0; i < nbWeb; i++)
{
SpiderWebEntity* web = new SpiderWebEntity(x, y, true);
float webVel = 100 + rand()% 500;
float webAngle = -60 + rand() % 120;
webAngle = PI * webAngle / 180.0f;
if (facingDirection == 4) webAngle += PI;
else if (facingDirection == 8) webAngle -= PI * 0.5;
else if (facingDirection == 2) webAngle += PI * 0.5;
web->setVelocity(Vector2D(webVel * cos(webAngle), webVel * sin(webAngle)));
}
}
void PlayerEntity::castSummonsFlower()
{
SoundManager::getInstance().playSound(SOUND_INVOKE);
EvilFlowerEntity* flower = new EvilFlowerEntity(x, y, FlowerTypePet);
flower->setLifetime(equip[EQUIP_BOOK_MAGIC_II] ? 45 : 35);
if (equip[EQUIP_BOOK_MAGIC_II]) flower->setFireDelayMax(EVIL_FLOWER_FIRE_DELAY);
}
void PlayerEntity::castTransmuteFairy()
{
if (isFairyTransmuted)
{
movingStyle = movWalking;
if (isCollidingWithMap())
movingStyle = movFlying;
else
{
SoundManager::getInstance().playSound(SOUND_INVOKE);
isFairyTransmuted = false;
computePlayer();
for(int i=0; i < 6; i++)
{
generateStar(sf::Color(50, 50, 255, 255));
generateStar(sf::Color(200, 200, 255, 255));
}
}
}
else
{
SoundManager::getInstance().playSound(SOUND_INVOKE);
isFairyTransmuted = true;
computePlayer();
for(int i=0; i < 6; i++)
{
generateStar(sf::Color(50, 50, 255, 255));
generateStar(sf::Color(200, 200, 255, 255));
}
}
}

File Metadata

Mime Type
text/x-diff
Expires
Fri, Jan 30, 3:42 PM (5 d, 10 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
55501
Default Alt Text
(194 KB)

Event Timeline