Page MenuHomePhabricator (Chris)

No OneTemporary

Size
158 KB
Referenced Files
None
Subscribers
None
diff --git a/data/labels.txt b/data/labels.txt
index a0b9725..9a44ea1 100644
--- a/data/labels.txt
+++ b/data/labels.txt
@@ -1,1808 +1,1808 @@
[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
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 250 rats
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
achiev_butcher#Butcher Slayer
achiev_butcher_desc#Kill the Butcher
achiev_witches#Inquisitor
achiev_witches_desc#Kill 50 witches
achiev_eggs#Bad omelette
achiev_eggs_desc#Destroy 100 eggs
achiev_fairies#Charlie's Angels
achiev_fairies_desc#Free 3 fairies
achiev_challenges#Gladiator
achiev_challenges_desc#Complete 4 challenges
achiev_win#Live a dream
achiev_win_desc#Finish the demo
func_achiev_screen#Achievements screen
func_achiev_all#All achievements descriptions
func_double_spell#Two spells drop
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_hat_advanced_desc#Elemental resistance + firerate up
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 up
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
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
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
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#КРИТИЧЕСКИЙ УДАР
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/src/PlayerEntity.cpp b/src/PlayerEntity.cpp
index 425787e..aef6e43 100644
--- a/src/PlayerEntity.cpp
+++ b/src/PlayerEntity.cpp
@@ -1,2820 +1,2827 @@
#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_ROBE])
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_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_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);
if (fairies.size() == 3) game().registerAchievement(AchievementFairies);
}
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);
game().proceedEvent(EventGetCoin);
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;
+ for (int i = 0; i < NB_RESISTANCES; i++) resistance[i] = ResistanceStandard;
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;
+ if (equip[EQUIP_HAT_ADVANCED])
+ {
+ fireDelayBonus -= 0.3f;
+ resistance[ResistanceIce] = (enumStateResistance)(resistance[ResistanceIce] - 1);
+ resistance[ResistanceStone] = (enumStateResistance)(resistance[ResistanceStone] - 1);
+ resistance[ResistanceLightning] = (enumStateResistance)(resistance[ResistanceLightning] - 1);
+ resistance[ResistanceFire] = (enumStateResistance)(resistance[ResistanceFire] - 1);
+ }
+
else if (equip[EQUIP_MAGICIAN_HAT]) fireDelayBonus -= 0.2f;
if (equip[EQUIP_LEATHER_BELT]) fireDelayBonus -= 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;
+ if (divinity.level >= 3) resistance[ResistanceIce] = (enumStateResistance)(resistance[ResistanceIce] - 1);
break;
}
case (DivinityStone):
{
if (divinity.level >= 5) resistance[ResistanceRecoil] = ResistanceVeryHigh;
- if (divinity.level >= 3) resistance[ResistanceStone] = ResistanceHigh;
+ if (divinity.level >= 3) resistance[ResistanceStone] = (enumStateResistance)(resistance[ResistanceStone] - 1);
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 * 0.8f);
}
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:39 PM (5 d, 16 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
55490
Default Alt Text
(158 KB)

Event Timeline