FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» demande explication KGF pour imprimer en mm
Générateur / editeur de donjon (les débuts) - Page 2 Emptypar JL35 Aujourd'hui à 17:28

» Petit passage furtif
Générateur / editeur de donjon (les débuts) - Page 2 Emptypar Froggy One Hier à 14:26

» SPIN et aide langage (résolu)
Générateur / editeur de donjon (les débuts) - Page 2 Emptypar leclode Sam 23 Mar 2024 - 15:20

» Aide-mémoire des mots-clés Panoramic
Générateur / editeur de donjon (les débuts) - Page 2 Emptypar papydall Mer 20 Mar 2024 - 21:23

» Je ne comprend pas pourquoi la largeur de la scene 3d change
Générateur / editeur de donjon (les débuts) - Page 2 Emptypar Marc Mar 12 Mar 2024 - 20:06

» Comment télécharger panoramic?
Générateur / editeur de donjon (les débuts) - Page 2 Emptypar lepetitmarocain Sam 9 Mar 2024 - 13:31

» @lepetitmarocain <==> KGFGrid
Générateur / editeur de donjon (les débuts) - Page 2 Emptypar Klaus Dim 3 Mar 2024 - 9:59

» Tangram-Toukaré
Générateur / editeur de donjon (les débuts) - Page 2 Emptypar jjn4 Mer 28 Fév 2024 - 18:12

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
Générateur / editeur de donjon (les débuts) - Page 2 Emptypar jjn4 Mer 28 Fév 2024 - 18:09

» KGF_dll - nouvelles versions
Générateur / editeur de donjon (les débuts) - Page 2 Emptypar Klaus Mer 28 Fév 2024 - 17:01

» Mes souhaits d'amélioration de Panoramic.
Générateur / editeur de donjon (les débuts) - Page 2 Emptypar Pedro Lun 26 Fév 2024 - 18:12

» Testez-votre-QI
Générateur / editeur de donjon (les débuts) - Page 2 Emptypar jjn4 Dim 25 Fév 2024 - 17:12

» Utilisation d'Élip
Générateur / editeur de donjon (les débuts) - Page 2 Emptypar jjn4 Sam 24 Fév 2024 - 18:33

» Récapitulatif ludothèque panoramic jjn4
Générateur / editeur de donjon (les débuts) - Page 2 Emptypar jjn4 Sam 24 Fév 2024 - 18:11

» Générateur de mots de passe
Générateur / editeur de donjon (les débuts) - Page 2 Emptypar mindstorm Mar 20 Fév 2024 - 20:09

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Mars 2024
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
25262728293031
CalendrierCalendrier
-20%
Le deal à ne pas rater :
-20% sur le Lot de 2 écrans PC GIGABYTE 27″ LED M27Q
429 € 539 €
Voir le deal

 

 Générateur / editeur de donjon (les débuts)

Aller en bas 
5 participants
Aller à la page : Précédent  1, 2
AuteurMessage
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Générateur / editeur de donjon (les débuts) - Page 2 Empty
MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Générateur / editeur de donjon (les débuts) - Page 2 EmptySam 3 Déc 2011 - 23:25

Bonjour, j'ai bossé un peu sur le programme, bon, il y a encore 2 "bugs":
- un dans la détection des combats quand on bouge qui n'est pas top
- je pensais pouvoir bloquer les déplacements du monstres pendant le combat, mais je dois faire une erreur logique

Sinon, le programme a une structure un peu bizzare car je l'ai rassemblé à partir des 4 includes que j'avais fait pour faciliter la mise au point. Une fois que le moteur de combat sera parfaitement au point, je remettrait le programme sous la forme du programme principale e de ses 4 includes
Code:
' ******************************************************************************
' ******************************************************************************
' **********************  DONJONS V3.0 par Jicehel  **************************
' ***********  basé sur: LABYRINTHE 3D version 12 (Créé par Bignono) **********
' *******************  EN BASIC PANORAMIC le 03/12/11  ***********************
' ******************************************************************************
' ******************************************************************************

label moteur, termine

scene3d 1 : full_space 1:light_position 0,1500,0
3d_skybox 1
3d_load_texture_back  1,"Decors\canyon_back.jpg" : 3d_load_texture_front  1,"Decors\canyon_front.jpg"
3d_load_texture_left  1,"Decors\canyon_left.jpg" : 3d_load_texture_right  1,"Decors\canyon_right.jpg"
3d_load_texture_top    1,"Decors\canyon_top.jpg"
3d_plane 2:3d_scale 2,500,500,1:3d_x_rotate 2,90:3d_y_position 2,0
3d_u_tile 2,500: 3d_v_tile 2,500 : 3d_load_texture 2,"Decors\sol.bmp"
3d_cube 3,1:3d_cube 4,1:3d_hide 3:3d_hide 4: ' CRÉATION DES VÉHICULES MOTEUR ET CAMÉRA

' -----------------------------
' Declaration monstrueuse
dim X_monstre(3), Y_monstre(3), dir_monstre(3), h_monstre(3), Cpt_monstre, mgd, mpt, Combat

' Déclaration des étiquettes
label Mvt_Monstre, MD1, MD2, MD3, MD4, Fin_monstre, Init_monstre, Init_combat

' Création des monstres
Cpt_monstre = 0 : 3d_mesh 5 : 3d_hide 5: 3d_load_object 5, "Monstres\skeleton.3ds"
3d_X_rotate 5,90: 3d_scale 5,10,10,10
' 3d_mesh 6 : 3d_hide 6: 3d_load_object 6, "Monstres\dragon-red.3DS"
' 3d_X_rotate 6,90:3d_scale 6,0.0003,0.0005,0.0005
goto Fin_monstre

' procédures
Init_monstre:

h_monstre(1)= 0
X_monstre(1) = int(rnd(h))+1 : Y_monstre(1) = int(rnd(v))+1

if bin_and(a(X_monstre(1),Y_monstre(1)),8) = 0
  dir_monstre(1)=1
  else
    if bin_and(a(X_monstre(1),Y_monstre(1)),1) = 0
      dir_monstre(1)=2
    else
      if bin_and(a(X_monstre(1),Y_monstre(1)),2) = 0
        dir_monstre(1)=3
      else
        if bin_and(a(X_monstre(1),Y_monstre(1)),4) = 0
          dir_monstre(1) = 4
        else
          dir_monstre(1) = 0
        end_if
      end_if
    end_if
end_if

' X_monstre(2) = 2: Y_monstre(2) = 1 : dir_monstre(2) = 1
3d_position 5, X_monstre(1)*pas_trace,h_monstre(1), Y_monstre(1)*pas_trace: 3d_show 5
' 3d_position 6, X_monstre(2)*pas_trace,0, Y_monstre(2)*pas_trace: 3d_show 6
return

Mvt_Monstre:

Cpt_monstre=0 : timer_off 2
if fin = 1
    combat = 0
    if gagne = 1
        Hide 300 : fin=0
'        message "Gagne !!"
        gosub init_monstre
    else
        Hide 300 : fin = 0
        message "Vous êtes mort ..."
        goto termine
    end_if
else
  if combat = 0
  select dir_monstre(1)

  case 0
    if ((x_monstre(1) = i) and (Y_monstre(1) = j)) then gosub init_combat

  case 1
    3d_z_rotate 5,0
    mgd=Y_monstre(1)*pas_trace:Y_monstre(1)=Y_monstre(1)+1:mpt=Y_monstre(1)*pas_trace
    if ((x_monstre(1) = i) and (Y_monstre(1) = j)) then gosub init_combat
    repeat
        mgd=mgd+pas::3d_position 5,X_monstre(1)*pas_trace,h_monstre(1),mgd
    until mgd>=mpt
    gosub MD1

  case 2
    3d_z_rotate 5,270
    mgd=X_monstre(1)*pas_trace:X_monstre(1)=X_monstre(1)-1:mpt=X_monstre(1)*pas_trace
    repeat
        mgd=mgd-pas:3d_position 5,mgd,h_monstre(1),Y_monstre(1)*pas_trace
    until mgd<=mpt
    gosub MD2

  case 3
    3d_z_rotate 5,180
    mpt=Y_monstre(1)*pas_trace:Y_monstre(1)=Y_monstre(1)-1:mgd=Y_monstre(1)*pas_trace
    if ((x_monstre(1) = i) and (Y_monstre(1) = j)) then gosub init_combat
    repeat
        mpt=mpt-pas:3d_position 5,X_monstre(1)*pas_trace,h_monstre(1),mpt
    until mgd>=mpt
    gosub MD3

  case 4
    3d_z_rotate 5,90
    mpt=X_monstre(1)*pas_trace:X_monstre(1)=X_monstre(1)+1:mgd=X_monstre(1)*pas_trace
    if ((x_monstre(1) = i) and (Y_monstre(1) = j)) then gosub init_combat
    repeat
        mpt=mpt+pas:3d_position 5,mpt,h_monstre(1),Y_monstre(1)*pas_trace
    until mpt>=mgd
    gosub MD4
  end_select
  end_if
end_if

if debug > 0
  caption 525, "Monstre: x  = "+ str$(X_monstre(1)) + "  :  Y= " + str$(Y_monstre(1)) + "  :  a(x,y)  = " +  str$(a(X_monstre(1),Y_monstre(1))) + " dir_monstre = "+ STR$(dir_monstre(1))+ "      "
'  if X_monstre(1) > H or Y_monstre(1) > V
'      Message "Monstre: x= "+ str$(X_monstre(1)) + " :  Y= " + str$(Y_monstre(1)) + "  :  a(x,y) = " +  str$(a(X_monstre(1),Y_monstre(1))) + " dir_monstre = "+ STR$(dir_monstre(1))
'  end_if
end_if
if combat = 0 then timer_on 2
return

MD1:

select a(X_monstre(1),Y_monstre(1))
  case 0
    if int(rnd(10)) > 4
      dir_monstre(1)=1
    else
      dir_monstre(1)=2
    end_if

  case 1
    if int(rnd(10)) > 4
      dir_monstre(1)=4
    else
      dir_monstre(1)=1
    end_if

  case 4
    if int(rnd(10)) > 4
      dir_monstre(1)=1
    else
      dir_monstre(1)=2
    end_if

  case 8
    if int(rnd(10)) > 4
      dir_monstre(1)=4
    else
      dir_monstre(1)=2
    end_if

  case 9
    if int(rnd(10)) > 3
      dir_monstre(1)=4
    else
      dir_monstre(1)=3
    end_if

  case 12
    if int(rnd(10)) > 3
      dir_monstre(1)=2
    else
      dir_monstre(1)=3
    end_if

  case 13
    dir_monstre(1)=3

end_select
return

MD2:

select a(X_monstre(1),Y_monstre(1))

  case 0
    if int(rnd(10)) > 4
      dir_monstre(1)=2
    else
      dir_monstre(1)=3
    end_if

 case 1
  if int(rnd(10)) > 4
    dir_monstre(1)=1
  else
    dir_monstre(1)=3
  end_if

 case 2
  if int(rnd(10)) > 4
    dir_monstre(1)=1
  else
    dir_monstre(1)=2
  end_if

 case 3
  dir_monstre(1)=1

 case 8
  if int(rnd(10)) > 4
    dir_monstre(1)=2
  else
    dir_monstre(1)=3
  end_if

 case 9
  dir_monstre(1)=3

 case 10
  if int(rnd(10)) > 3
    dir_monstre(1)=2
  else
    dir_monstre(1)=4
  end_if

 case 11
  dir_monstre(1)=4

end_select
return


MD3:

select a(X_monstre(1),Y_monstre(1))

  case 0
    if int(rnd(10)) > 4
      dir_monstre(1)=3
    else
      dir_monstre(1)=4
    end_if

  case 1
    if int(rnd(10)) > 4
      dir_monstre(1)=3
    else
      dir_monstre(1)=1
    end_if

  case 2
    if int(rnd(10)) > 4
      dir_monstre(1)=2
    else
      dir_monstre(1)=4
    end_if

  case 3
    if int(rnd(10)) > 3
      dir_monstre(1)=4
    else
      dir_monstre(1)=1
    end_if

  case 4
    if int(rnd(10)) > 4
      dir_monstre(1)=2
    else
      dir_monstre(1)=3
    end_if

  case 5
    if int(rnd(10)) > 3
      dir_monstre(1)=3
    else
      dir_monstre(1)=1
    end_if

  case 6
    if int(rnd(10)) > 3
      dir_monstre(1)=2
    else
      dir_monstre(1)=1
    end_if

  case 7
    dir_monstre(1)=1

  case 8
    if int(rnd(10)) > 4
      dir_monstre(1)=2
    else
      dir_monstre(1)=3
    end_if

end_select
return

MD4:

select a(X_monstre(1),Y_monstre(1))

  case 0
    if int(rnd(10)) > 4
      dir_monstre(1)=4
    else
      dir_monstre(1)=1
    end_if

  case 2
    if int(rnd(10)) > 4
      dir_monstre(1)=1
    else
      dir_monstre(1)=4
    end_if

  case 4
    if int(rnd(10)) > 4
      dir_monstre(1)=3
    else
      dir_monstre(1)=1
    end_if

  case 6
    if int(rnd(10)) > 4
      dir_monstre(1)=1
    else
      dir_monstre(1)=2
    end_if

  case 8
    if int(rnd(10)) > 4
      dir_monstre(1)=3
    else
      dir_monstre(1)=4
    end_if

  case 10
    if int(rnd(10)) > 3
      dir_monstre(1)=4
    else
      dir_monstre(1)=2
    end_if

  case 12
    if int(rnd(10)) > 4
      dir_monstre(1)=3
    else
      dir_monstre(1)=2
    end_if

  case 14
    dir_monstre(1)=2

end_select
return

Init_combat:
  3d_Hide 5 : Timer_off 2: EnnemiSelectionne = 1 : gosub NouveauCombat
return

Fin_monstre:

' -----------------------------

dim c_gauche,c_droite,c_avant,espace,pas,pasv,pas_trace
dim ang,d,dtn,gd,h,v,i,j,k,pt,rot,w, a(30,30),debug

' Initialisation des chaines de caractères
dim Chemin$ : Chemin$ = "C:\temp"  :                        ' Chemin de base du programme
dim F_level$, Chaine$ : F_level$ = Chemin$ + "\level.dat" : ' Fichier de data du niveau

label affiche,droite,gauche,pan1,pan2,pan4,pan8,pivot,trace, charge_laby, fin_laby

dim texture_mur1 : texture_mur1 = 101 : image texture_mur1: file_load texture_mur1,"Decors\mur1.bmp"
dim texture_mur2 : texture_mur2 = 102 : image texture_mur2: file_load texture_mur2,"Decors\mur2.bmp"
dim texture_mur3 : texture_mur3 = 103 : image texture_mur3: file_load texture_mur3,"Decors\mur3.bmp"
dim texture_mur4 : texture_mur4 = 105 : image texture_mur4: file_load texture_mur4,"Decors\mur4.bmp"

' ******************************************************************************
' ************************ INITIALISATION DES VARIABLES ************************
' ******************************************************************************
' ** h et v représentent les dimensions du labyrinthe (vous pouvez les modifier,
' mais plus le labyrinthe est grand, plus le programme ralentit!) **************
' ****** pas : sert à règler la vitesse de déplacement dans le labyrinthe ******
' ****** pasv: sert à règler la vitesse du zoom vertical ***********************

debug = 1

if debug > 0
  v = 22
  form 520: width 520, 400 : height 520, (V+5) * 17: top 520, 0  : left 520,800
  for i = 1 to 30
      alpha 520 + i: parent 520 + i,520: height 520 + i, 17 : top 520 + i, (17*i) - 14  : left 520 + i,3
  next i
end_if

gosub charge_laby
d=1:w=4:espace=0:c_gauche=0:c_droite=0:c_avant=0: pas=1:pasv=2 : pas_trace = 8


' ******************************************************************************
' ****************    CONSTRUCTION DU LABYRINTHE EN 3D  ***********************
' ******************************************************************************

' CAS 1 = MUR GAUCHE, CAS 2 = MUR ARRIÈRE, CAS 4 = MUR DROIT, CAS 8 = MUR FACE
' LES AUTRES CAS, C'EST UNE ADDITION; EX: CAS 3 = CAS 1 + CAS 2
 for j=0 to v+1
  for i=0 to h+1
    select a(i,j)
      case 1:      if i=h+1 then gosub pan1: ' mur de gauche (G)
      case 2:      if j=v+1 then gosub pan2: ' mur du bas    (B)
      case 4:      gosub pan4              : ' mur de droite (D)
      case 5:      gosub pan4              : ' G+D
      case 6:      gosub pan4              : ' B+D
      case 7:      gosub pan4              : ' G+B+D (cul de sac en u)
      case 8:      gosub pan8              : ' mur du haut  (H)
      case 9:      gosub pan8              : ' G+H
      case 10:      gosub pan8              : ' B+H
      case 11:      gosub pan8              : ' G+B+H (cul de sac en [)
      case 12:      gosub pan4:gosub pan8  : ' D+H
      case 13:      gosub pan4:gosub pan8  : ' G+D+H (cul de sac en n)
      case 14:      gosub pan4:gosub pan8  : ' B+D+H (cul de sac en ])
      case 15:      gosub pan4:gosub pan8  : ' Tout fermé []
    end_select
  next i
next j
' ******************************************************************************
goto fin_laby

' ******************************************************************************
' *********************    LES ROUTINES      ***********************************
' ******************************************************************************

' CALCUL DES POSITIONS DES VÉHICULES MOTEUR ET CAMÉRA
affiche:
3d_position 4,o3d_x_position(3),o3d_y_position(3),o3d_z_position(3):3d_rotate 4,o3d_x_rotate(3),o3d_y_rotate(3),o3d_z_rotate(3)
3d_move 4,1:cam_position o3d_x_position(3),w,o3d_z_position(3):point_position o3d_x_position(4),4,o3d_z_position(4)
return

' CRÉATION DES MURS DU LABYRINTHE : Vous pouvez supprimer les 3d_color et mettre
' à la place un 3d_load_texture si vous voulez habillez les murs!!!
pan1:
3d_box number_3d_objects+1,pas_trace-0.02,10,1:3d_position number_3d_objects,i*pas_trace-pas_trace/2,4,j*pas_trace
3d_y_rotate number_3d_objects,90: 3d_image_texture number_3d_objects, texture_mur1
return
pan2:
3d_box number_3d_objects+1,pas_trace,10,1:3d_position number_3d_objects,i*pas_trace,4,j*pas_trace - pas_trace/2
3d_image_texture number_3d_objects, texture_mur4
return
pan4:
 3d_box number_3d_objects+1,pas_trace-0.02,10,1:3d_position number_3d_objects,i*pas_trace+pas_trace/2,4,j*pas_trace
 3d_y_rotate number_3d_objects,90:3d_image_texture number_3d_objects, texture_mur2
return
pan8:
 3d_box number_3d_objects+1,pas_trace,10,1:3d_position number_3d_objects,i*pas_trace,4,j*pas_trace + pas_trace/2
 3d_image_texture number_3d_objects, texture_mur3
return

' VISION DE HAUT DU LABYRINTHE EN 3D
trace:
  repeat
      w=w+pasv:cam_position o3d_x_position(3),w,o3d_z_position(3):display
  until w=70

repeat
if scancode=27 then goto termine
if scancode=37 then gosub gauche
if scancode=39 then gosub droite
Cpt_monstre = Cpt_monstre + 1: If Cpt_monstre = 5 then gosub Mvt_Monstre
wait 200
until scancode=32

  repeat
      w=w-pasv:cam_position o3d_x_position(3),w,o3d_z_position(3):display
  until w=4
  espace=0
  goto moteur


' ROTATION A GAUCHE
gauche:
ang=rot+90:dtn=dtn+1:if dtn>4 then dtn=1
    repeat
        rot=rot+6*pas:3d_y_rotate 3,rot:if w>4 then gosub pivot
        gosub affiche
    until rot>=ang
    c_gauche=0
return

' ROTATION A DROITE
droite:
 ang=rot-90:dtn=dtn-1:if dtn<1 then dtn=4
    repeat
        rot=rot-6*pas:3d_y_rotate 3,rot:if w>4 then gosub pivot
        gosub affiche
    until rot<=ang
    c_droite=0
return

' ROTATION DE LA CAMÉRA LORS DE LA VISION DE HAUT
pivot:
cam_position o3d_x_position(3),o3d_y_position(3)+w,o3d_z_position(3)
return


charge_laby:

FILE_OPEN_READ 50, F_level$
for i = 1 to 3 :  File_readln 50, chaine$ : Next i
File_readln 50, chaine$
H = val(Left$ (Chaine$,2))
V = val(Right$(Chaine$,2))
File_Readln 50, chaine$:  File_Readln 50, chaine$
for j=0 to V+1
'  if debug > 0 then Caption 521 + j,Chaine$
  chaine$=Right$(Chaine$, len(Chaine$) - 1)
  i=0
  while len(chaine$) > 2
    a(i,j)=val(Left$(Chaine$,2))
    chaine$=Right$(Chaine$, len(Chaine$) - 3)
    i=i+1
  end_while
  File_Readln 50, chaine$
next j
file_close 50
return

fin_laby:


' -----------------------------

' ici toutes les variables comunues a plusieurs modules
' plus tard les sub et fonctions générales

dim Nb_Monstres, Nb_armes, Tour, XPLevelUp, XPdeBase, MultiplicateurXP, CalculXP
dim EnnemiSelectionne, PVEnnemi

Nb_Monstres = 10 : Nb_armes = 10 : XPdeBase = 5 : MultiplicateurXP = 1.6

' carracteristiques perso
dim hero(20)  : ' Tableau stockant les caractéristiques du héro
hero(1) = 12 : ' 1  => force        (3D6): puissance du héros
hero(2) = 9  : ' 2  => dexterité    (3D6): habileté à toucher et rapidité d'action
hero(3) = 15 : ' 3  => constitution (3D6): résistance du héros
hero(4) = 4  : ' 4  => puissance magique (3D6): capacité a faire de la magie
hero(5) = 7  : ' 5  => niveau du heros
hero(6) = 1  : ' 6  => arme équipée (0: rien, 1: dague, 2: épée, 3: arc, ...)
hero(7) = (((hero(3)-5)*3) +1) : ' 7 => Nb de points de vie
hero(8) = (((hero(4)-5)*3) +1) : ' 8 => Nb de points de mana
hero(9) = 100: ' 9  => nombre de point d'expérience
hero(10) = 30: ' 10 => capacité du héro à l'arme blanche  (max 100%)
hero(11) = 40: ' 11 => capacité du héro à l'arc


dim nom_ennemi$(Nb_Monstres) , ennemi(Nb_Monstres,7)

nom_ennemi$(1)="gobelin des collines"
ennemi(1,1) = 10 : ' 1 => force
ennemi(1,2) = 8  : ' 2 => dextérité
ennemi(1,3) = 12 : ' 3 => constitution
ennemi(1,4) = 0  : ' 4 => puissance magique
ennemi(1,5) = 7  : ' 5 => niveau de l'ennemi (comme le heros pour les tests)
ennemi(1,6) = 1  : ' 6 => arme équipée (dague)
ennemi(1,7) = (((ennemi(1,3) -  5) * 3) +1) : ' 7 => Nb de point de vie


dim nom_arme$(Nb_armes), arme(Nb_armes,6)

' Définition de la dague
nom_arme$(1)="dague"
arme(1,2)= 100    : ' 2 => Precision de l'arme
arme(1,3)= 6      : ' 3 => Dégats de l'arme
arme(1,4)= 0      : ' 4 => Gène occasionnée par l'arme
arme(1,5)= 0      : ' 5 => Protection apportée par l'arme
arme(1,6)= 20    : ' 6 => Prix de l'arme

' Définition de l'épée
nom_arme$(2)="épée"
arme(2,2)= 80    : ' 2 => Precision de l'arme
arme(2,3)= 9    : ' 3 => Dégats de l'arme
arme(2,4)= 15    : ' 4 => Gène occasionnée par l'arme
arme(2,5)= 0    : ' 5 => Protection apportée par l'arme
arme(2,6)= 200  : ' 6 => Prix de l'arme


' -----------------------------
' ici tout ce qui est specifique au combat

' Definition des étiquettes
label Action_hero, Action_ennemi, fin_combat
label sub_hero_attaque, sub_hero_magie, sub_enemmi_attaque, NouveauCombat

' Définition des variables
dim quiCommence, ChanceToucher, JetDes, Degats, fin, gagne


' Initiailisation de la fenêtre de combat
form 300: hide 300 : Combat = 0
width 300 ,800 : height 300,600 :' Définition de la fenêtre principale


' grand rectangle
PICTURE 303: PARENT 303, 300 : WIDTH 303, 750:  HEIGHT 303, 400 : COLOR 303,128,128,128
2d_target_is 303  : ' cible 2d

' mechant
2d_fill_color 250,0,0 : 2d_rectangle 150,200,200,350

' heros
2d_fill_color 0,0,250 : 2d_rectangle 600,200,650,350

' petit recangle
PICTURE 304 : parent 304, 300 : TOP 304, 410: LEFT 304, 0: WIDTH 304, 750:  HEIGHT 304, 150 : COLOR 304,255,128,128
2d_target_is 304 : 2d_rectangle 10,10,250,140 : 2d_rectangle 300,10,550,140

' textes a l'ecran
alpha 310: parent 310, 300 : left 310,13 :top 310,425:caption 310,"points de vie Hero : "  + str$(hero(7))
alpha 311: parent 311, 300 : left 311,313:top 311,425:caption 311,"points de vie Ennemi : " + str$(ennemi(1,7))
alpha 312: parent 312, 300 : parent 310, 300 : left 312,13 :top 312,470:caption 312,"attaque :"
alpha 314: parent 314, 300 : left 314,313:top 314,450:caption 314,"Ennemi: Aucun"
alpha 323: parent 323, 300 : left 323,580:top 323,425
alpha 324: parent 324, 300 : left 324,580:top 324,450

' texte de commentaires sur le combat
alpha 313: parent 313, 300 :left 313,13:top 313,20 : font_size 313,12 : caption 313,""
alpha 315: parent 315, 300 :left 315,13:top 315,42 : font_size 315,12 : caption 315,""
alpha 316: parent 316, 300 :left 316,13:top 316,64 : font_size 316,12 : caption 316,""
alpha 317: parent 317, 300 :left 317,13:top 317,86 : font_size 317,12 : caption 317,""
alpha 318: parent 318, 300 :left 318,13:top 318,108: font_size 318,12 : caption 318,""

' declaration et positionnement des options
option 321 : parent 321, 300 : top 321,450:left 321,80:caption 321,"ATTAQUER"
option 322 : parent 322, 300 : top 322,470:left 322,80:caption 322,"MAGIE"
' option 323 : parent 323, 300 : top 23,490:left 23,100:caption 23,"ARC LONG"

' boutton pour valider le type d'attaque
button 330 : parent 330, 300 : top 330,510:left 330,80: width 330,150 : caption 330,"VALIDER SELECTION"
on_click 330,Action_hero

' boutton pour valider le type d'attaque
 button 331 : parent 331, 300 : top 331,510:left 331,313: width 331,150 : caption 331,"ATTAQUE DE L'ENNEMI"
 on_click 331, Action_ennemi

' inactive les bouttons
inactive 330 : inactive 331 : wait 300

goto fin_combat


NouveauCombat:
show 300
caption 313,"Début du combat entre le héro est un "+ nom_ennemi$(EnnemiSelectionne)
caption 314,"Ennemi: " + nom_ennemi$(EnnemiSelectionne)
quiCommence = int((rnd(10)*10+rnd(10)) - (rnd(10)*10+rnd(10)) + (hero(2) * 5) - (ennemi(EnnemiSelectionne,2)) * 5)
Tour = 0  : XPLevelUp = ((hero(5) + 50)* Power(hero(5)+1,2))
PVEnnemi = ennemi(EnnemiSelectionne,7)
caption 323,"XP :                  " + right$("00000000"+str$(hero(9)),8)
caption 324,"XP niv suivant :" + right$("00000000"+str$(XPLevelUp),8)
caption 315,"Rouge : Héro / Bleu : "+nom_ennemi$(EnnemiSelectionne)
' quiCommence = 1 et c'est le hero qui commence sinon c'est l'ennemi
if quiCommence > 0
 caption 316,"Le héro commence le combat"
 active 330
else
 caption 316,"Le "+nom_ennemi$(EnnemiSelectionne) +" commence le combat"
 gosub Action_ennemi
end_if
return


' ---------- FONCTIONS ----------
'
Action_hero:

if checked(321) = 1 or checked(322) = 1

  Tour = Tour + 1
  caption 313, "Tour en cours : "+str$(Tour)
  caption 317, "": caption 318,""

' test l'option choise
 if checked(321) = 1
  caption 315,"Le héro attaque avec " + nom_arme$(hero(6))
  ' Affiche le nom de l'arme dont est équipé le héro
  gosub sub_hero_attaque
 end_if

 if checked(322) = 1
  ' message "magie"
  caption 315,"Le héro attaque avec de la magie"
  gosub sub_hero_magie
 end_if

 caption 310,"points de vie Hero : "  + str$(hero(7))
 caption 311,"points de vie Ennemi : " + str$(PVEnnemi)

 ' lance le tour de l'enemi
 inactive 330
 if PVEnnemi > 0
  ' active 31
  gosub Action_ennemi
 else
      if hero(5) <= ennemi(EnnemiSelectionne,5)
        CalculXP = hero(5)-1-ennemi(EnnemiSelectionne,5)
        CalculXP = (0-CalculXP)*XPdeBase
      else
        CalculXP = int(ennemi(EnnemiSelectionne,5) - hero(5) +2)/MultiplicateurXP*XPdeBase+1
        If CalculXP <=0 Then CalculXP=1
      end_if
      hero(7) = (((hero(3)-5)*3) +1)
      hero(9) = hero(9) + int(CalculXP * Power(ennemi(EnnemiSelectionne,5),2))
      fin=1: gagne=1
 end_if
end_if
return


Action_ennemi:
 ' inactive 31
 gosub sub_enemmi_attaque
 if hero(7) > 0
  active 330
 else
  fin=1: gagne=0
 end_if
 caption 310,"points de vie Hero : "  + str$(hero(7))
 caption 311,"points de vie Ennemi : " + str$(PVEnnemi)

return



' -- Attaque avec une arme ---------------------------------------------------
sub_hero_attaque:

' calculer s'il y a blessure
ChanceToucher = int(((hero(2)* 4 + hero(4)*4) /2) + rnd(35))
' Caption 21,"ATTAQUER ("+str$(ChanceToucher)+"%)"
JetDes = int(rnd(10))*10 + int(rnd(10)) : ' simule lancer de 2 D 10 faces
' message "chancetoucher " + str$(ChanceToucher) + " jetdes " + str$(jetdes)
if JetDes < ChanceToucher
' si blessure , calculer les dédats selon l'arme utilisée (pas de gestion de l'armure pour le moment)
 Degats = int((1 + (hero(1)-5)/4) * rnd(arme(hero(6),3))) + 1
' int((1 + hero(2)/4) * rnd(arme(hero(6),3)))
 caption 316, "ennemi bléssé pv perdus : " + str$(Degats)
 PVEnnemi = PVEnnemi - Degats
else
 caption 316,"L'ennemi n'a pas été touché"
end_if

return


' -- Attaque avec la magie ---------------------------------------------------
sub_hero_magie:

' calculer s'il y a blessure
ChanceToucher = int((hero(2)* 5 + hero(10)) /2) * (arme(hero(6),2)/100)
Caption 321,"MAGIE ("+str$(ChanceToucher)+"%)"
JetDes = int(rnd(10))*10 + int(rnd(10)) : ' simule lancer de 2 D 10 faces

if JetDes < ChanceToucher
' si blessure , calculer les dédats (pas de gestion des sorts pour le moment)
 Degats = int((1 + (hero(2)-5)/4) * rnd(arme(hero(6),3))) + 1
 caption 316,"Ennemi blessé - PV perdus : " + str$(Degats)
 PVEnnemi = PVEnnemi - Degats
else
 caption 316, "L'ennemi n'a pas été touché"
end_if

return

' -- Attaque de l'ennemi -----------------------------------------------------
sub_enemmi_attaque:

' calculer s'il y a blessure
ChanceToucher =  int(((ennemi(EnnemiSelectionne,2)* 4 + ennemi(EnnemiSelectionne,4) *4)/2) + rnd(25))
JetDes = int(rnd(10))*10 + int(rnd(10)) : ' simule lancer de 2 D 10 faces
caption 317,"Le " + nom_ennemi$(EnnemiSelectionne) +" attaque avec " + nom_arme$(Ennemi(EnnemiSelectionne,6))
if JetDes < ChanceToucher
' si blessure , calculer les dégats selon l'arme utilisée (pas de gestion de l'armure pour le moment)

 Degats = int( (1 + (ennemi(EnnemiSelectionne,1)-5)/4) * rnd(arme(ennemi(EnnemiSelectionne,6),3))) +  1
 Caption 318,"Héro blessé - PV perdus : " + str$(Degats)
 hero(7) = hero(7) - Degats
else
 Caption 318,"Le héro n'a pas été touché"
end_if

return

fin_combat:



' ******************************************************************************
' ** Initialisation position de départ et création d'un timer pour gérer les  **
' * déplacements. Si le programme plante augmentez la valeur du timer_interval *
' ******************************************************************************
i=1:j=1 : dtn = 1
Gosub init_monstre
3d_position 3,i*pas_trace,4,j*pas_trace:gosub affiche
timer 2:timer_interval 2,200:on_timer 2,moteur
end


' ******************************************************************************
' *****************    LE PROGRAMME PRINCIPAL    ******************************
' ******************************************************************************
moteur:
timer_off 2
if debug > 0
    show 520
    caption 521, "Boucle moteur"
    caption 522, "Etat des touches:  Espace:" + str$(espace) + "  Gauche : " + str$(c_gauche) + "  Droite : " + str$(c_droite) + "      "
    caption 523, "dtn = " + str$(dtn) + "  : i (dep. laéral) = " + str$(i) + "  : j (dép vertical) = "+str$(j)
    caption 524, "test dtn="+ str$(dtn) +" => a(i,j) = "+str$(a(i,j))
    caption 525, "Monstre: x  = "+ str$(X_monstre(1)) + "  :  Y= " + str$(Y_monstre(1)) + "  :  a(x,y)  = " +  str$(a(X_monstre(1),Y_monstre(1))) + " dir_monstre = "+ STR$(dir_monstre(1))+ "      "
end_if
if espace=1 then goto trace
if c_gauche=1 then gosub gauche
if c_droite=1 then gosub droite
if c_avant=1
    if dtn=1 and j < v
        if debug > 1 then caption 524, "test dtn=1 avec j<v+1 => a(i,j) = "+str$(a(i,j))
        if a(i,j) < 8
            pt=j*pas_trace:j=j+1:gd=j*pas_trace
              repeat
                pt=pt+pas:3d_move 3,pas:gosub affiche
              until pt>=gd
        end_if
    end_if

    if dtn=2 and i < h  and j > 0
        if debug > 1 then caption 524, "test dtn=2 avec i<h et j > 1 => a(i,j) = "+str$(a(i,j))
        if a(i,j)<4 or a(i,j)>7 and a(i,j)<12
          pt=i*pas_trace:i=i+1:gd=i*pas_trace
              repeat
                pt=pt+pas:3d_move 3,pas:gosub affiche
              until pt>=gd
        end_if
    end_if

    if dtn=3 and j > 0
        if debug > 1 then caption 524, "test dtn=3 avec j > 2 => a(i,j) = "+str$(a(i,j))
        if a(i,j)=0 or a(i,j)=1 or a(i,j)=4 or a(i,j)=5 or a(i,j)=8 or a(i,j)=9 or a(i,j)=12 or a(i,j)=13
            pt=j*pas_trace:j=j-1:gd=j*pas_trace
              repeat
                gd=gd+pas:3d_move 3,pas:gosub affiche
              until gd>=pt
        end_if
    end_if

    if dtn=4 and i > 1 and j > 0
        if debug > 1 then caption 524, "test dtn=4 avec i > 2 => a(i,j) = "+str$(a(i,j))
        if odd(a(i,j))=0
            pt=i*pas_trace:i=i-1:gd=i*pas_trace
              repeat
                gd=gd+pas:3d_move 3,pas:gosub affiche
              until gd>=pt
        end_if
    end_if
    c_avant=0
end_if

select scancode
case 27:goto termine: ' SORTIE PROGRAMME
case 32:espace=1:    ' AFFICHAGE DU PLAN DU LABYRINTHE
case 37:c_gauche=1:  ' FLECHE GAUCHE = ROTATION A GAUCHE
case 39:c_droite=1:  ' FLECHE DROITE = ROTATION A DROITE
case 38:c_avant=1:    ' FLECHE HAUT = DTN DEFINIT LA DIRECTION NORD, OUEST, SUD OU EST
end_select

3d_position 3, i*pas_trace,4,j*pas_trace

' TEST DE SORTIE DU LABYRINTHE
' if j=v+1
'  beep_exclamation:message "BRAVO, VOUS ETES SORTI DU LABYRINTHE!":goto termine
' end_if

Cpt_monstre = Cpt_monstre + 1: If Cpt_monstre = 5 then gosub Mvt_Monstre

if combat = 0 then timer_on 2

return


' SORTIE DU PROGRAMME
termine:
timer_off 2
terminate
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Générateur / editeur de donjon (les débuts) - Page 2 Empty
MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Générateur / editeur de donjon (les débuts) - Page 2 EmptyLun 5 Déc 2011 - 2:58

J'ai travaillé cette nuit sur les "monstres" en 3D
Du coup, je ne colle pas le code, il est à peine changé et se trouve dans le zip: donjons.zip

Donc, les objets 3D ajoutés sont dans le répertoire monstres
Dans ce répertoire figure un fichier texte (paramètres_objets.txt) qui contient les lignes à modifier dans Explore_Donjon-v3b.bas


Contenu du fichier : paramètres_objets.txt
Code:
3d_mesh 5 : 3d_hide 5
' puis selon le monstre:

' Squelette
angle_monstre(1) = 0: h_monstre(1)= 0
3d_load_object 5, "Monstres\skeleton.3ds" : 3d_color 5,10,10,10
3d_X_rotate 5,90 : 3d_scale 5,10,10,10


' Cobra
angle_monstre(1) = 270: h_monstre(1)= 0
3d_load_object 5, "Monstres\cobra.md2": 3d_load_texture 5,"Monstres\cobra.jpg"
3d_X_rotate 5,90 : 3d_scale 5,0.1,0.1,0.08


' Dragon
angle_monstre(1) = 0: h_monstre(1)= 0
3d_load_object 5, "Monstres\dragon-red.3DS" : 3d_color 5,50,10,10
3d_X_rotate 5,90:3d_scale 5,0.0003,0.0005,0.0005


' Aigle
angle_monstre(1) = 270: h_monstre(1)= 5
3d_load_object 5, "Monstres\eagle.md2" : 3d_load_texture 5,"Monstres\eagle.jpg"
3d_X_rotate 5,90:3d_Z_rotate 5,angle_monstre(1): 3d_scale 5,0.1,0.1,0.1


' Singe
angle_monstre(1) = 270: h_monstre(1)= 0
3d_load_object 5, "Monstres\monkey.md2": 3d_load_texture 5,"Monstres\brute.jpg"
3d_X_rotate 5,90 : 3d_scale 5,0.1,0.07,0.08


' Imp (monstre marron à pointe)
angle_monstre(1) = 270: h_monstre(1)= 0
3d_load_object 5, "Monstres\imp.md2" : 3d_load_texture 5,"Monstres\imp.jpg"
3d_X_rotate 5,90 : 3d_scale 5,0.06,0.06,0.07


' Revenant
angle_monstre(1) = 270: h_monstre(1)= 0
3d_load_object 5, "Monstres\revenant.md2" : 3d_load_texture 5,"Monstres\revenant.jpg"
3d_X_rotate 5,90 : 3d_scale 5,0.06,0.06,0.09


' Serpent
angle_monstre(1) = 270: h_monstre(1)= 0
3d_load_object 5, "Monstres\snake.md2" : 3d_load_texture 5,"Monstres\snake.jpg"
3d_X_rotate 5,90 : 3d_scale 5,0.08,0.1,0.12


' Guerrier Humain en pagne
angle_monstre(1) = 270: h_monstre(1)= 0
3d_load_object 5, "Monstres\warrior.md2" : 3d_load_texture 5,"Monstres\warrior.jpg"
3d_X_rotate 5,90 : 3d_scale 5,0.07,0.07,0.07


' Orc - Grunt (problème d'affichage)
angle_monstre(1) = 0: h_monstre(1)= 0
3d_load_object 5, "Monstres\3dm-Grunt.3ds"
3d_X_rotate 5,90 : 3d_scale 5,0.04,0.05,0.048


' ***********************************
' Non utilisé (moderne)

' Cyber deamon
angle_monstre(1) = 270: h_monstre(1)= 0
3d_load_object 5, "Monstres\Cyber.md2" : 3d_load_texture 5,"Monstres\Cyber.jpg"
3d_X_rotate 5,90 : 3d_scale 5,0.04,0.04,0.04
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Générateur / editeur de donjon (les débuts) - Page 2 Empty
MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Générateur / editeur de donjon (les débuts) - Page 2 EmptyMar 6 Déc 2011 - 2:14

Bon, je mets juste une petite modif du code pour bloquer les déplacements (monstres / perso) et améliorer la détection des combats. Bon, prochaine étape, améliorer le "graphisme" de l'affichage des combats pour la rendre un peu plus sexy...
Code:
' ******************************************************************************
' ******************************************************************************
' **********************  DONJONS V3.0 par Jicehel  **************************
' ***********  basé sur: LABYRINTHE 3D version 12 (Créé par Bignono) **********
' *******************  EN BASIC PANORAMIC le 03/12/11  ***********************
' ******************************************************************************
' ******************************************************************************

label moteur, termine

scene3d 1 : full_space 1:light_position 0,1500,0
3d_skybox 1
3d_load_texture_back  1,"Decors\canyon_back.jpg" : 3d_load_texture_front  1,"Decors\canyon_front.jpg"
3d_load_texture_left  1,"Decors\canyon_left.jpg" : 3d_load_texture_right  1,"Decors\canyon_right.jpg"
3d_load_texture_top    1,"Decors\canyon_top.jpg"
3d_plane 2:3d_scale 2,500,500,1:3d_x_rotate 2,90:3d_y_position 2,0
3d_u_tile 2,500: 3d_v_tile 2,500 : 3d_load_texture 2,"Decors\sol.bmp"
3d_cube 3,1:3d_cube 4,1:3d_hide 3:3d_hide 4: ' CRÉATION DES VÉHICULES MOTEUR ET CAMÉRA

' -----------------------------
' Declaration monstrueuse
dim X_monstre(3), Y_monstre(3), dir_monstre(3), h_monstre(3), Cpt_monstre, mgd, mpt, Combat
dim angle_monstre(3)

' Déclaration des étiquettes
label Mvt_Monstre, MD1, MD2, MD3, MD4, Fin_monstre, Init_monstre, Init_combat

' Création des monstres
Cpt_monstre = 0 : 3d_mesh 5 : 3d_hide 5
angle_monstre(1) = 270: h_monstre(1)= 0
3d_load_object 5, "Monstres\revenant.md2" : 3d_load_texture 5,"Monstres\revenant.jpg"
3d_X_rotate 5,90 : 3d_scale 5,0.06,0.06,0.09

goto Fin_monstre

' procédures
Init_monstre:

X_monstre(1) = int(rnd(h))+1 : Y_monstre(1) = int(rnd(v))+1

if bin_and(a(X_monstre(1),Y_monstre(1)),8) = 0
  dir_monstre(1)=1
  else
    if bin_and(a(X_monstre(1),Y_monstre(1)),1) = 0
      dir_monstre(1)=2
    else
      if bin_and(a(X_monstre(1),Y_monstre(1)),2) = 0
        dir_monstre(1)=3
      else
        if bin_and(a(X_monstre(1),Y_monstre(1)),4) = 0
          dir_monstre(1) = 4
        else
          dir_monstre(1) = 0
        end_if
      end_if
    end_if
end_if

' X_monstre(2) = 2: Y_monstre(2) = 1 : dir_monstre(2) = 1
3d_position 5, X_monstre(1)*pas_trace,h_monstre(1), Y_monstre(1)*pas_trace: 3d_show 5
' 3d_position 6, X_monstre(2)*pas_trace,0, Y_monstre(2)*pas_trace: 3d_show 6
return

Mvt_Monstre:

Cpt_monstre=0 : timer_off 2
if fin = 1
    combat = 0
    if gagne = 1
        Hide 300 : fin=0
'        message "Gagne !!"
        gosub init_monstre
    else
        Hide 300 : fin = 0
        message "Vous êtes mort ..."
        goto termine
    end_if
else
  if combat = 0
  select dir_monstre(1)

  case 0
    if ((x_monstre(1) = i) and (Y_monstre(1) = j)) then gosub init_combat

  case 1
    3d_z_rotate 5,angle_monstre(1)
    mgd=Y_monstre(1)*pas_trace:Y_monstre(1)=Y_monstre(1)+1:mpt=Y_monstre(1)*pas_trace
    if ((x_monstre(1) = i) and (Y_monstre(1) = j)) then gosub init_combat
    repeat
        mgd=mgd+pas::3d_position 5,X_monstre(1)*pas_trace,h_monstre(1),mgd
    until mgd>=mpt
    gosub MD1

  case 2
    k = angle_monstre(1) + 270 : if k > 360 then k=k-360
    3d_z_rotate 5, k
    mgd=X_monstre(1)*pas_trace:X_monstre(1)=X_monstre(1)-1:mpt=X_monstre(1)*pas_trace
    repeat
        mgd=mgd-pas:3d_position 5,mgd,h_monstre(1),Y_monstre(1)*pas_trace
    until mgd<=mpt
    gosub MD2

  case 3
    k = angle_monstre(1) + 180 : if k > 360 then k=k-360
    3d_z_rotate 5,k
    mpt=Y_monstre(1)*pas_trace:Y_monstre(1)=Y_monstre(1)-1:mgd=Y_monstre(1)*pas_trace
    if ((x_monstre(1) = i) and (Y_monstre(1) = j)) then gosub init_combat
    repeat
        mpt=mpt-pas:3d_position 5,X_monstre(1)*pas_trace,h_monstre(1),mpt
    until mgd>=mpt
    gosub MD3

  case 4
    k = angle_monstre(1) + 90 : if k > 360 then k=k-360
    3d_z_rotate 5,k
    mpt=X_monstre(1)*pas_trace:X_monstre(1)=X_monstre(1)+1:mgd=X_monstre(1)*pas_trace
    if ((x_monstre(1) = i) and (Y_monstre(1) = j)) then gosub init_combat
    repeat
        mpt=mpt+pas:3d_position 5,mpt,h_monstre(1),Y_monstre(1)*pas_trace
    until mpt>=mgd
    gosub MD4
  end_select
  end_if
end_if

if debug > 0
  caption 525, "Monstre: x  = "+ str$(X_monstre(1)) + "  :  Y= " + str$(Y_monstre(1)) + "  :  a(x,y)  = " +  str$(a(X_monstre(1),Y_monstre(1))) + " dir_monstre = "+ STR$(dir_monstre(1))+ "      "
'  if X_monstre(1) > H or Y_monstre(1) > V
'      Message "Monstre: x= "+ str$(X_monstre(1)) + " :  Y= " + str$(Y_monstre(1)) + "  :  a(x,y) = " +  str$(a(X_monstre(1),Y_monstre(1))) + " dir_monstre = "+ STR$(dir_monstre(1))
'  end_if
end_if
if combat = 0 then timer_on 2
return

MD1:

select a(X_monstre(1),Y_monstre(1))
  case 0
    if int(rnd(10)) > 4
      dir_monstre(1)=1
    else
      dir_monstre(1)=2
    end_if

  case 1
    if int(rnd(10)) > 4
      dir_monstre(1)=4
    else
      dir_monstre(1)=1
    end_if

  case 4
    if int(rnd(10)) > 4
      dir_monstre(1)=1
    else
      dir_monstre(1)=2
    end_if

  case 8
    if int(rnd(10)) > 4
      dir_monstre(1)=4
    else
      dir_monstre(1)=2
    end_if

  case 9
    if int(rnd(10)) > 3
      dir_monstre(1)=4
    else
      dir_monstre(1)=3
    end_if

  case 12
    if int(rnd(10)) > 3
      dir_monstre(1)=2
    else
      dir_monstre(1)=3
    end_if

  case 13
    dir_monstre(1)=3

end_select
return

MD2:

select a(X_monstre(1),Y_monstre(1))

  case 0
    if int(rnd(10)) > 4
      dir_monstre(1)=2
    else
      dir_monstre(1)=3
    end_if

 case 1
  if int(rnd(10)) > 4
    dir_monstre(1)=1
  else
    dir_monstre(1)=3
  end_if

 case 2
  if int(rnd(10)) > 4
    dir_monstre(1)=1
  else
    dir_monstre(1)=2
  end_if

 case 3
  dir_monstre(1)=1

 case 8
  if int(rnd(10)) > 4
    dir_monstre(1)=2
  else
    dir_monstre(1)=3
  end_if

 case 9
  dir_monstre(1)=3

 case 10
  if int(rnd(10)) > 3
    dir_monstre(1)=2
  else
    dir_monstre(1)=4
  end_if

 case 11
  dir_monstre(1)=4

end_select
return


MD3:

select a(X_monstre(1),Y_monstre(1))

  case 0
    if int(rnd(10)) > 4
      dir_monstre(1)=3
    else
      dir_monstre(1)=4
    end_if

  case 1
    if int(rnd(10)) > 4
      dir_monstre(1)=3
    else
      dir_monstre(1)=1
    end_if

  case 2
    if int(rnd(10)) > 4
      dir_monstre(1)=2
    else
      dir_monstre(1)=4
    end_if

  case 3
    if int(rnd(10)) > 3
      dir_monstre(1)=4
    else
      dir_monstre(1)=1
    end_if

  case 4
    if int(rnd(10)) > 4
      dir_monstre(1)=2
    else
      dir_monstre(1)=3
    end_if

  case 5
    if int(rnd(10)) > 3
      dir_monstre(1)=3
    else
      dir_monstre(1)=1
    end_if

  case 6
    if int(rnd(10)) > 3
      dir_monstre(1)=2
    else
      dir_monstre(1)=1
    end_if

  case 7
    dir_monstre(1)=1

  case 8
    if int(rnd(10)) > 4
      dir_monstre(1)=2
    else
      dir_monstre(1)=3
    end_if

end_select
return

MD4:

select a(X_monstre(1),Y_monstre(1))

  case 0
    if int(rnd(10)) > 4
      dir_monstre(1)=4
    else
      dir_monstre(1)=1
    end_if

  case 2
    if int(rnd(10)) > 4
      dir_monstre(1)=1
    else
      dir_monstre(1)=4
    end_if

  case 4
    if int(rnd(10)) > 4
      dir_monstre(1)=3
    else
      dir_monstre(1)=1
    end_if

  case 6
    if int(rnd(10)) > 4
      dir_monstre(1)=1
    else
      dir_monstre(1)=2
    end_if

  case 8
    if int(rnd(10)) > 4
      dir_monstre(1)=3
    else
      dir_monstre(1)=4
    end_if

  case 10
    if int(rnd(10)) > 3
      dir_monstre(1)=4
    else
      dir_monstre(1)=2
    end_if

  case 12
    if int(rnd(10)) > 4
      dir_monstre(1)=3
    else
      dir_monstre(1)=2
    end_if

  case 14
    dir_monstre(1)=2

end_select
return

Init_combat:
  3d_Hide 5 : Timer_off 2: EnnemiSelectionne = 1 : gosub NouveauCombat
return

Fin_monstre:

' -----------------------------

dim c_gauche,c_droite,c_avant,espace,pas,pasv,pas_trace
dim ang,d,dtn,gd,h,v,i,j,k,pt,rot,w, a(30,30),debug

' Initialisation des chaines de caractères
dim Chemin$ : Chemin$ = "C:\temp"  :                        ' Chemin de base du programme
dim F_level$, Chaine$ : F_level$ = Chemin$ + "\level.dat" : ' Fichier de data du niveau

label affiche,droite,gauche,pan1,pan2,pan4,pan8,pivot,trace, charge_laby, fin_laby

dim texture_mur1 : texture_mur1 = 101 : image texture_mur1: file_load texture_mur1,"Decors\mur1.bmp"
dim texture_mur2 : texture_mur2 = 102 : image texture_mur2: file_load texture_mur2,"Decors\mur2.bmp"
dim texture_mur3 : texture_mur3 = 103 : image texture_mur3: file_load texture_mur3,"Decors\mur3.bmp"
dim texture_mur4 : texture_mur4 = 105 : image texture_mur4: file_load texture_mur4,"Decors\mur4.bmp"

' ******************************************************************************
' ************************ INITIALISATION DES VARIABLES ************************
' ******************************************************************************
' ** h et v représentent les dimensions du labyrinthe (vous pouvez les modifier,
' mais plus le labyrinthe est grand, plus le programme ralentit!) **************
' ****** pas : sert à règler la vitesse de déplacement dans le labyrinthe ******
' ****** pasv: sert à règler la vitesse du zoom vertical ***********************

debug = 1

if debug > 0
  v = 22
  form 520: width 520, 400 : height 520, (V+5) * 17: top 520, 0  : left 520,800
  for i = 1 to 30
      alpha 520 + i: parent 520 + i,520: height 520 + i, 17 : top 520 + i, (17*i) - 14  : left 520 + i,3
  next i
end_if

gosub charge_laby
d=1:w=4:espace=0:c_gauche=0:c_droite=0:c_avant=0: pas=1:pasv=2 : pas_trace = 8


' ******************************************************************************
' ****************    CONSTRUCTION DU LABYRINTHE EN 3D  ***********************
' ******************************************************************************

' CAS 1 = MUR GAUCHE, CAS 2 = MUR ARRIÈRE, CAS 4 = MUR DROIT, CAS 8 = MUR FACE
' LES AUTRES CAS, C'EST UNE ADDITION; EX: CAS 3 = CAS 1 + CAS 2
 for j=0 to v+1
  for i=0 to h+1
    select a(i,j)
      case 1:      if i=h+1 then gosub pan1: ' mur de gauche (G)
      case 2:      if j=v+1 then gosub pan2: ' mur du bas    (B)
      case 4:      gosub pan4              : ' mur de droite (D)
      case 5:      gosub pan4              : ' G+D
      case 6:      gosub pan4              : ' B+D
      case 7:      gosub pan4              : ' G+B+D (cul de sac en u)
      case 8:      gosub pan8              : ' mur du haut  (H)
      case 9:      gosub pan8              : ' G+H
      case 10:      gosub pan8              : ' B+H
      case 11:      gosub pan8              : ' G+B+H (cul de sac en [)
      case 12:      gosub pan4:gosub pan8  : ' D+H
      case 13:      gosub pan4:gosub pan8  : ' G+D+H (cul de sac en n)
      case 14:      gosub pan4:gosub pan8  : ' B+D+H (cul de sac en ])
      case 15:      gosub pan4:gosub pan8  : ' Tout fermé []
    end_select
  next i
next j
' ******************************************************************************
goto fin_laby

' ******************************************************************************
' *********************    LES ROUTINES      ***********************************
' ******************************************************************************

' CALCUL DES POSITIONS DES VÉHICULES MOTEUR ET CAMÉRA
affiche:
3d_position 4,o3d_x_position(3),o3d_y_position(3),o3d_z_position(3):3d_rotate 4,o3d_x_rotate(3),o3d_y_rotate(3),o3d_z_rotate(3)
3d_move 4,1:cam_position o3d_x_position(3),w,o3d_z_position(3):point_position o3d_x_position(4),4,o3d_z_position(4)
return

' CRÉATION DES MURS DU LABYRINTHE : Vous pouvez supprimer les 3d_color et mettre
' à la place un 3d_load_texture si vous voulez habillez les murs!!!
pan1:
3d_box number_3d_objects+1,pas_trace-0.02,10,1:3d_position number_3d_objects,i*pas_trace-pas_trace/2,4,j*pas_trace
3d_y_rotate number_3d_objects,90: 3d_image_texture number_3d_objects, texture_mur1
return
pan2:
3d_box number_3d_objects+1,pas_trace,10,1:3d_position number_3d_objects,i*pas_trace,4,j*pas_trace - pas_trace/2
3d_image_texture number_3d_objects, texture_mur4
return
pan4:
 3d_box number_3d_objects+1,pas_trace-0.02,10,1:3d_position number_3d_objects,i*pas_trace+pas_trace/2,4,j*pas_trace
 3d_y_rotate number_3d_objects,90:3d_image_texture number_3d_objects, texture_mur2
return
pan8:
 3d_box number_3d_objects+1,pas_trace,10,1:3d_position number_3d_objects,i*pas_trace,4,j*pas_trace + pas_trace/2
 3d_image_texture number_3d_objects, texture_mur3
return

' VISION DE HAUT DU LABYRINTHE EN 3D
trace:
  repeat
      w=w+pasv:cam_position o3d_x_position(3),w,o3d_z_position(3):display
  until w=70

repeat
if scancode=27 then goto termine
if scancode=37 then gosub gauche
if scancode=39 then gosub droite

if Combat = 0 or fin=1
  Cpt_monstre = Cpt_monstre + 1
  If Cpt_monstre = 5 then gosub Mvt_Monstre
end_if

wait 100

until scancode=32

  repeat
      w=w-pasv:cam_position o3d_x_position(3),w,o3d_z_position(3):display
  until w=4
  espace=0
  goto moteur


' ROTATION A GAUCHE
gauche:
ang=rot+90:dtn=dtn+1:if dtn>4 then dtn=1
    repeat
        rot=rot+6*pas:3d_y_rotate 3,rot:if w>4 then gosub pivot
        gosub affiche
    until rot>=ang
    c_gauche=0
return

' ROTATION A DROITE
droite:
 ang=rot-90:dtn=dtn-1:if dtn<1 then dtn=4
    repeat
        rot=rot-6*pas:3d_y_rotate 3,rot:if w>4 then gosub pivot
        gosub affiche
    until rot<=ang
    c_droite=0
return

' ROTATION DE LA CAMÉRA LORS DE LA VISION DE HAUT
pivot:
cam_position o3d_x_position(3),o3d_y_position(3)+w,o3d_z_position(3)
return


charge_laby:

FILE_OPEN_READ 50, F_level$
for i = 1 to 3 :  File_readln 50, chaine$ : Next i
File_readln 50, chaine$
H = val(Left$ (Chaine$,2))
V = val(Right$(Chaine$,2))
File_Readln 50, chaine$:  File_Readln 50, chaine$
for j=0 to V+1
'  if debug > 0 then Caption 521 + j,Chaine$
  chaine$=Right$(Chaine$, len(Chaine$) - 1)
  i=0
  while len(chaine$) > 2
    a(i,j)=val(Left$(Chaine$,2))
    chaine$=Right$(Chaine$, len(Chaine$) - 3)
    i=i+1
  end_while
  File_Readln 50, chaine$
next j
file_close 50
return

fin_laby:


' -----------------------------

' ici toutes les variables comunues a plusieurs modules
' plus tard les sub et fonctions générales

dim Nb_Monstres, Nb_armes, Tour, XPLevelUp, XPdeBase, MultiplicateurXP, CalculXP
dim EnnemiSelectionne, PVEnnemi

Nb_Monstres = 10 : Nb_armes = 10 : XPdeBase = 5 : MultiplicateurXP = 1.6

' carracteristiques perso
dim hero(20)  : ' Tableau stockant les caractéristiques du héro
hero(1) = 12 : ' 1  => force        (3D6): puissance du héros
hero(2) = 9  : ' 2  => dexterité    (3D6): habileté à toucher et rapidité d'action
hero(3) = 15 : ' 3  => constitution (3D6): résistance du héros
hero(4) = 4  : ' 4  => puissance magique (3D6): capacité a faire de la magie
hero(5) = 7  : ' 5  => niveau du heros
hero(6) = 1  : ' 6  => arme équipée (0: rien, 1: dague, 2: épée, 3: arc, ...)
hero(7) = (((hero(3)-5)*3) +1) : ' 7 => Nb de points de vie
hero(8) = (((hero(4)-5)*3) +1) : ' 8 => Nb de points de mana
hero(9) = 100: ' 9  => nombre de point d'expérience
hero(10) = 30: ' 10 => capacité du héro à l'arme blanche  (max 100%)
hero(11) = 40: ' 11 => capacité du héro à l'arc


dim nom_ennemi$(Nb_Monstres) , ennemi(Nb_Monstres,7)

nom_ennemi$(1)="Squelette animé"
ennemi(1,1) = 10 : ' 1 => force
ennemi(1,2) = 8  : ' 2 => dextérité
ennemi(1,3) = 12 : ' 3 => constitution
ennemi(1,4) = 0  : ' 4 => puissance magique
ennemi(1,5) = 7  : ' 5 => niveau de l'ennemi (comme le heros pour les tests)
ennemi(1,6) = 1  : ' 6 => arme équipée (dague)
ennemi(1,7) = (((ennemi(1,3) -  5) * 3) +1) : ' 7 => Nb de point de vie


dim nom_arme$(Nb_armes), arme(Nb_armes,6)

' Définition de la dague
nom_arme$(1)="dague"
arme(1,2)= 100    : ' 2 => Precision de l'arme
arme(1,3)= 6      : ' 3 => Dégats de l'arme
arme(1,4)= 0      : ' 4 => Gène occasionnée par l'arme
arme(1,5)= 0      : ' 5 => Protection apportée par l'arme
arme(1,6)= 20    : ' 6 => Prix de l'arme

' Définition de l'épée
nom_arme$(2)="épée"
arme(2,2)= 80    : ' 2 => Precision de l'arme
arme(2,3)= 9    : ' 3 => Dégats de l'arme
arme(2,4)= 15    : ' 4 => Gène occasionnée par l'arme
arme(2,5)= 0    : ' 5 => Protection apportée par l'arme
arme(2,6)= 200  : ' 6 => Prix de l'arme


' -----------------------------
' ici tout ce qui est specifique au combat

' Definition des étiquettes
label Action_hero, Action_ennemi, fin_combat
label sub_hero_attaque, sub_hero_magie, sub_enemmi_attaque, NouveauCombat

' Définition des variables
dim quiCommence, ChanceToucher, JetDes, Degats, fin, gagne


' Initiailisation de la fenêtre de combat
form 300: hide 300 : Combat = 0
width 300 ,800 : height 300,600 :' Définition de la fenêtre principale


' grand rectangle
PICTURE 303: PARENT 303, 300 : WIDTH 303, 750:  HEIGHT 303, 400 : COLOR 303,128,128,128
2d_target_is 303  : ' cible 2d

' mechant
2d_fill_color 250,0,0 : 2d_rectangle 150,200,200,350

' heros
2d_fill_color 0,0,250 : 2d_rectangle 600,200,650,350

' petit recangle
PICTURE 304 : parent 304, 300 : TOP 304, 410: LEFT 304, 0: WIDTH 304, 750:  HEIGHT 304, 150 : COLOR 304,255,128,128
2d_target_is 304 : 2d_rectangle 10,10,250,140 : 2d_rectangle 300,10,550,140

' textes a l'ecran
alpha 310: parent 310, 300 : left 310,13 :top 310,425:caption 310,"points de vie Hero : "  + str$(hero(7))
alpha 311: parent 311, 300 : left 311,313:top 311,425:caption 311,"points de vie Ennemi : " + str$(ennemi(1,7))
alpha 312: parent 312, 300 : parent 310, 300 : left 312,13 :top 312,470:caption 312,"attaque :"
alpha 314: parent 314, 300 : left 314,313:top 314,450:caption 314,"Ennemi: Aucun"
alpha 323: parent 323, 300 : left 323,580:top 323,425
alpha 324: parent 324, 300 : left 324,580:top 324,450

' texte de commentaires sur le combat
alpha 313: parent 313, 300 :left 313,13:top 313,20 : font_size 313,12 : caption 313,""
alpha 315: parent 315, 300 :left 315,13:top 315,42 : font_size 315,12 : caption 315,""
alpha 316: parent 316, 300 :left 316,13:top 316,64 : font_size 316,12 : caption 316,""
alpha 317: parent 317, 300 :left 317,13:top 317,86 : font_size 317,12 : caption 317,""
alpha 318: parent 318, 300 :left 318,13:top 318,108: font_size 318,12 : caption 318,""

' declaration et positionnement des options
option 321 : parent 321, 300 : top 321,450:left 321,80:caption 321,"ATTAQUER"
option 322 : parent 322, 300 : top 322,470:left 322,80:caption 322,"MAGIE"
' option 323 : parent 323, 300 : top 23,490:left 23,100:caption 23,"ARC LONG"

' boutton pour valider le type d'attaque
button 330 : parent 330, 300 : top 330,510:left 330,80: width 330,150 : caption 330,"VALIDER SELECTION"
on_click 330,Action_hero

' boutton pour valider le type d'attaque
 button 331 : parent 331, 300 : top 331,510:left 331,313: width 331,150 : caption 331,"ATTAQUE DE L'ENNEMI"
 on_click 331, Action_ennemi

' inactive les bouttons
inactive 330 : inactive 331 : wait 300

goto fin_combat


NouveauCombat:
show 300 : Combat = 1
caption 313,"Début du combat entre le héro est un "+ nom_ennemi$(EnnemiSelectionne)
caption 314,"Ennemi: " + nom_ennemi$(EnnemiSelectionne)
quiCommence = int((rnd(10)*10+rnd(10)) - (rnd(10)*10+rnd(10)) + (hero(2) * 5) - (ennemi(EnnemiSelectionne,2)) * 5)
Tour = 0  : XPLevelUp = ((hero(5) + 50)* Power(hero(5)+1,2))
PVEnnemi = ennemi(EnnemiSelectionne,7)
caption 323,"XP :                  " + right$("00000000"+str$(hero(9)),8)
caption 324,"XP niv suivant :" + right$("00000000"+str$(XPLevelUp),8)
caption 315,"Rouge : Héro / Bleu : "+nom_ennemi$(EnnemiSelectionne)
' quiCommence = 1 et c'est le hero qui commence sinon c'est l'ennemi
if quiCommence > 0
 caption 316,"Le héro commence le combat"
 active 330
else
 caption 316,"Le "+nom_ennemi$(EnnemiSelectionne) +" commence le combat"
 gosub Action_ennemi
end_if
return


' ---------- FONCTIONS ----------
'
Action_hero:

if checked(321) = 1 or checked(322) = 1

  Tour = Tour + 1
  caption 313, "Tour en cours : "+str$(Tour)
  caption 317, "": caption 318,""

' test l'option choise
 if checked(321) = 1
  caption 315,"Le héro attaque avec " + nom_arme$(hero(6))
  ' Affiche le nom de l'arme dont est équipé le héro
  gosub sub_hero_attaque
 end_if

 if checked(322) = 1
  ' message "magie"
  caption 315,"Le héro attaque avec de la magie"
  gosub sub_hero_magie
 end_if

 caption 310,"points de vie Hero : "  + str$(hero(7))
 caption 311,"points de vie Ennemi : " + str$(PVEnnemi)

 ' lance le tour de l'enemi
 inactive 330
 if PVEnnemi > 0
  ' active 31
  gosub Action_ennemi
 else
      if hero(5) <= ennemi(EnnemiSelectionne,5)
        CalculXP = hero(5)-1-ennemi(EnnemiSelectionne,5)
        CalculXP = (0-CalculXP)*XPdeBase
      else
        CalculXP = int(ennemi(EnnemiSelectionne,5) - hero(5) +2)/MultiplicateurXP*XPdeBase+1
        If CalculXP <=0 Then CalculXP=1
      end_if
      hero(7) = (((hero(3)-5)*3) +1)
      hero(9) = hero(9) + int(CalculXP * Power(ennemi(EnnemiSelectionne,5),2))
      fin=1: gagne=1 : timer_on 2
 end_if
end_if
return


Action_ennemi:
 ' inactive 31
 gosub sub_enemmi_attaque
 if hero(7) > 0
  active 330
 else
  fin=1: gagne=0 : timer_on 2
 end_if
 caption 310,"points de vie Hero : "  + str$(hero(7))
 caption 311,"points de vie Ennemi : " + str$(PVEnnemi)

return



' -- Attaque avec une arme ---------------------------------------------------
sub_hero_attaque:

' calculer s'il y a blessure
ChanceToucher = int(((hero(2)* 4 + hero(4)*4) /2) + rnd(35))
' Caption 21,"ATTAQUER ("+str$(ChanceToucher)+"%)"
JetDes = int(rnd(10))*10 + int(rnd(10)) : ' simule lancer de 2 D 10 faces
' message "chancetoucher " + str$(ChanceToucher) + " jetdes " + str$(jetdes)
if JetDes < ChanceToucher
' si blessure , calculer les dédats selon l'arme utilisée (pas de gestion de l'armure pour le moment)
 Degats = int((1 + (hero(1)-5)/4) * rnd(arme(hero(6),3))) + 1
' int((1 + hero(2)/4) * rnd(arme(hero(6),3)))
 caption 316, "ennemi bléssé pv perdus : " + str$(Degats)
 PVEnnemi = PVEnnemi - Degats
else
 caption 316,"L'ennemi n'a pas été touché"
end_if

return


' -- Attaque avec la magie ---------------------------------------------------
sub_hero_magie:

' calculer s'il y a blessure
ChanceToucher = int((hero(2)* 5 + hero(10)) /2) * (arme(hero(6),2)/100)
Caption 321,"MAGIE ("+str$(ChanceToucher)+"%)"
JetDes = int(rnd(10))*10 + int(rnd(10)) : ' simule lancer de 2 D 10 faces

if JetDes < ChanceToucher
' si blessure , calculer les dédats (pas de gestion des sorts pour le moment)
 Degats = int((1 + (hero(2)-5)/4) * rnd(arme(hero(6),3))) + 1
 caption 316,"Ennemi blessé - PV perdus : " + str$(Degats)
 PVEnnemi = PVEnnemi - Degats
else
 caption 316, "L'ennemi n'a pas été touché"
end_if

return

' -- Attaque de l'ennemi -----------------------------------------------------
sub_enemmi_attaque:

' calculer s'il y a blessure
ChanceToucher =  int(((ennemi(EnnemiSelectionne,2)* 4 + ennemi(EnnemiSelectionne,4) *4)/2) + rnd(25))
JetDes = int(rnd(10))*10 + int(rnd(10)) : ' simule lancer de 2 D 10 faces
caption 317,"Le " + nom_ennemi$(EnnemiSelectionne) +" attaque avec " + nom_arme$(Ennemi(EnnemiSelectionne,6))
if JetDes < ChanceToucher
' si blessure , calculer les dégats selon l'arme utilisée (pas de gestion de l'armure pour le moment)

 Degats = int( (1 + (ennemi(EnnemiSelectionne,1)-5)/4) * rnd(arme(ennemi(EnnemiSelectionne,6),3))) +  1
 Caption 318,"Héro blessé - PV perdus : " + str$(Degats)
 hero(7) = hero(7) - Degats
else
 Caption 318,"Le héro n'a pas été touché"
end_if

return

fin_combat:



' ******************************************************************************
' ** Initialisation position de départ et création d'un timer pour gérer les  **
' * déplacements. Si le programme plante augmentez la valeur du timer_interval *
' ******************************************************************************
i=1:j=1 : dtn = 1
Gosub init_monstre
3d_position 3,i*pas_trace,4,j*pas_trace:gosub affiche
timer 2:timer_interval 2,200:on_timer 2,moteur
end


' ******************************************************************************
' *****************    LE PROGRAMME PRINCIPAL    ******************************
' ******************************************************************************
moteur:
timer_off 2
if debug > 0
    show 520
    caption 521, "Boucle moteur"
    caption 522, "Etat des touches:  Espace:" + str$(espace) + "  Gauche : " + str$(c_gauche) + "  Droite : " + str$(c_droite) + "      "
    caption 523, "dtn = " + str$(dtn) + "  : i (dep. laéral) = " + str$(i) + "  : j (dép vertical) = "+str$(j)
    caption 524, "test dtn="+ str$(dtn) +" => a(i,j) = "+str$(a(i,j))
    caption 525, "Monstre: x  = "+ str$(X_monstre(1)) + "  :  Y= " + str$(Y_monstre(1)) + "  :  a(x,y)  = " +  str$(a(X_monstre(1),Y_monstre(1))) + " dir_monstre = "+ STR$(dir_monstre(1))+ "      "
end_if
if fin=0
if espace=1 then goto trace
if c_gauche=1 then gosub gauche
if c_droite=1 then gosub droite
if c_avant=1
    if dtn=1 and j < v
        if debug > 1 then caption 524, "test dtn=1 avec j<v+1 => a(i,j) = "+str$(a(i,j))
        if a(i,j) < 8
            pt=j*pas_trace:j=j+1:gd=j*pas_trace
              repeat
                pt=pt+pas:3d_move 3,pas:gosub affiche
              until pt>=gd
        end_if
    end_if

    if dtn=2 and i < h  and j > 0
        if debug > 1 then caption 524, "test dtn=2 avec i<h et j > 1 => a(i,j) = "+str$(a(i,j))
        if a(i,j)<4 or a(i,j)>7 and a(i,j)<12
          pt=i*pas_trace:i=i+1:gd=i*pas_trace
              repeat
                pt=pt+pas:3d_move 3,pas:gosub affiche
              until pt>=gd
        end_if
    end_if

    if dtn=3 and j > 0
        if debug > 1 then caption 524, "test dtn=3 avec j > 2 => a(i,j) = "+str$(a(i,j))
        if a(i,j)=0 or a(i,j)=1 or a(i,j)=4 or a(i,j)=5 or a(i,j)=8 or a(i,j)=9 or a(i,j)=12 or a(i,j)=13
            pt=j*pas_trace:j=j-1:gd=j*pas_trace
              repeat
                gd=gd+pas:3d_move 3,pas:gosub affiche
              until gd>=pt
        end_if
    end_if

    if dtn=4 and i > 1 and j > 0
        if debug > 1 then caption 524, "test dtn=4 avec i > 2 => a(i,j) = "+str$(a(i,j))
        if odd(a(i,j))=0
            pt=i*pas_trace:i=i-1:gd=i*pas_trace
              repeat
                gd=gd+pas:3d_move 3,pas:gosub affiche
              until gd>=pt
        end_if
    end_if
    c_avant=0
end_if
end_if

if ((x_monstre(1) = i) and (Y_monstre(1) = j)) then gosub init_combat

select scancode
case 27:goto termine: ' SORTIE PROGRAMME
case 32:espace=1:    ' AFFICHAGE DU PLAN DU LABYRINTHE
case 37:c_gauche=1:  ' FLECHE GAUCHE = ROTATION A GAUCHE
case 39:c_droite=1:  ' FLECHE DROITE = ROTATION A DROITE
case 38:c_avant=1:    ' FLECHE HAUT = DTN DEFINIT LA DIRECTION NORD, OUEST, SUD OU EST
end_select

3d_position 3, i*pas_trace,4,j*pas_trace

' TEST DE SORTIE DU LABYRINTHE
' if j=v+1
'  beep_exclamation:message "BRAVO, VOUS ETES SORTI DU LABYRINTHE!":goto termine
' end_if

If Combat=0 or fin=1
  Cpt_monstre = Cpt_monstre + 1
  If Cpt_monstre = 5 then gosub Mvt_Monstre
  timer_on 2
End_if


return


' SORTIE DU PROGRAMME
termine:
timer_off 2
terminate
Revenir en haut Aller en bas
bignono

bignono


Nombre de messages : 1127
Age : 66
Localisation : Val de Marne
Date d'inscription : 13/11/2011

Générateur / editeur de donjon (les débuts) - Page 2 Empty
MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Générateur / editeur de donjon (les débuts) - Page 2 EmptyMar 6 Déc 2011 - 7:12

bonjour Jicehel, Smile

Ça n'a pas l'air mal pour le moment. J'ai cependant une erreur qui se produit au bout d'un moment: "29 _ Not correct arithmetic expression_ Index overflow line 188." (comme j'ai rajouté une ligne, ce doit être la ligne 187 en réalité)
Aussi, (juste une fois, pas tout le temps) après avoir fait la vision de haut, Mademoiselle le monstre avait disparu. Tu veux la garder pour toi? Hein, c'est ça, avoue! Laughing
cheers
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Générateur / editeur de donjon (les débuts) - Page 2 Empty
MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Générateur / editeur de donjon (les débuts) - Page 2 EmptyMar 6 Déc 2011 - 8:01

Tu as tout compris Smile
Bon si vous avez des idées pour améliorer le programme, je suis preneur.
Là, je vais essayer d'améliorer l'esttique de l'interface de combat (pour passer une temps encore plus agréable avec Mademoislle le Monstre)... Après maintenant que j'ai trouvé mon bonheur en objets / monstres dans Quake et ses add-ons et que j'ai compris comment les récupérer, j'aimerais pouvoir ajouter des décors et un moyen de les sauvegarder, puis je ferais le fichier des monstres (Nom, Nom des objets, images et caractéristiques)
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Générateur / editeur de donjon (les débuts) - Page 2 Empty
MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Générateur / editeur de donjon (les débuts) - Page 2 EmptyVen 9 Déc 2011 - 1:15

Bon, je vous mets le lien sur le zip du programme dans son état actuel (préparation de la gestion des monstres, dans le fichier parametres des monstres, il y a 25 monstres prêts à être affichés.
J'ai mis une variable pour le nom du fichier pour le monstre actif pour préparer la lecture d'un fichier avec un minimum de variables et simplifier un peu (j'espère).
J'ai préparé quelques vignettes de monstres dans monstres_2D c'est l'image qui s'affiche pendant les combats.


Fichier zip: http://panoramic-rpg.e-monsite.com/medias/files/donjons-2.zip

Aller bonne nuit tout le monde et si vous avez des idées ou si vous faites des ajouts (monstres, fonctionnalités, ou n'importe quoi, n'hésitez pas à me le dire)
Revenir en haut Aller en bas
bignono

bignono


Nombre de messages : 1127
Age : 66
Localisation : Val de Marne
Date d'inscription : 13/11/2011

Générateur / editeur de donjon (les débuts) - Page 2 Empty
MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Générateur / editeur de donjon (les débuts) - Page 2 EmptyVen 9 Déc 2011 - 7:24

bonjour Jicehel Very Happy

Ça avance petit à petit. (tu as toujours la même erreur que je t'ai signalé précédemment). Pas mal tes personnages. Peux-tu me dire sur quel site tu as téléchargé ces objets md2. Tu as des textures de qualité pour certains.
Moi, sur je ne sais plus quel site, j'avais trouvé beaucoup de fichier md2, mais la qualité des objets et textures laissait franchement à désirer. La plupart avait une résolution de 256x256, d'autres en 252x195 ou 220x193. Yen avait même en 128x128 et 64x64.
D'ailleurs si quelqu'un connait un site où télécharger des fichiers md2 avec textures, je suis preneur!
On trouve beaucoup de site pour les objets 3ds ou d'autres types (obj, lwo,etc...) Il suffit d'avoir un logiciel 3d comme wings ou blender qui sont gratuits et on peut exporter les objets en 3ds. Les sites où je télécharge le plus les objets 3d :
Archives 3d et turbosquid.
On y trouve énormément de choses. A vous de faire le tri!
Bon courage à toi Jicehel et à tout le monde d'ailleurs.
Smile
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Générateur / editeur de donjon (les débuts) - Page 2 Empty
MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Générateur / editeur de donjon (les débuts) - Page 2 EmptyVen 9 Déc 2011 - 8:55

Les monstres viennent de jheretic, jdoom et autres ... j'ai fais un peu de recherche sur les forum des mods de ces jeux. Pour l'erreur, je suis désolé, mais comme je n'arrive pas à la reproduire, je ne sais pas comment résoudre. Peux tu me faire un copier des 4/5 lignes où il te dit qu'il y a une erreur ?

Tu as aimé l'écran de combat ? C'est un peu plus chouette ? Si tu as des idées d'amélioration (voir mieux si tu veux améliorer des trucs) n'hésites pas.
Revenir en haut Aller en bas
bignono

bignono


Nombre de messages : 1127
Age : 66
Localisation : Val de Marne
Date d'inscription : 13/11/2011

Générateur / editeur de donjon (les débuts) - Page 2 Empty
MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Générateur / editeur de donjon (les débuts) - Page 2 EmptyVen 9 Déc 2011 - 14:36

Salut Jicehel,

Je te mets les lignes qui me génère l'erreur avec les etiquettes correspondantes pour que tu saches où cela ce situe.
Code:
MD1:
select a(X_monstre(1),Y_monstre(1))
MD2:
select a(X_monstre(1),Y_monstre(1))
MD3:
select a(X_monstre(1),Y_monstre(1))
MD4:
select a(X_monstre(1),Y_monstre(1))
D'autre part ton monstre passe à travers les murs et se ballade à l'extérieur, il ne rentre plus dans le donjon.
Et comme au bout d'un moment, l'erreur arrive, je ne peux même pas voir ton interface de combat.

Pour l'instant je travaille toujours sur un projet alliant mon labyrinthe et le chateau en 3d, mais comme j'ai eu plusieurs gros bug dans mon prog et pas assez de place pour afficher dans les couloirs du labyrinthe mon personnage, je suis en train de recommencer à zéro en redimensionnant tout! Bref, c'est la cata...! Mais j'espère m'en sortir. Je vais doucement à mon rythme. J'espère vous montrer le résultat dans le courant janvier si tout va bien.

A bientôt...
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Générateur / editeur de donjon (les débuts) - Page 2 Empty
MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Générateur / editeur de donjon (les débuts) - Page 2 EmptyVen 9 Déc 2011 - 16:16

OK, je pense savoir ce qui t'arrive. Tu n'a pas dû régénérer de nouveau donjon depuis quelques temps.
Je m'explique. Normalement, le monstre commence forcément à l'intérieur du labyrinthe (à moins que tu ais changé la position en (0, 0) manuellement. Normalement, maintenant il va de 1,1 à H,V.
Je pense à ça car tu me dis que le monstre traverse les murs, ce qui se produisait avec les premières versions du générateur de donjon avec les murs extérieusr. En effet, je forçais un mur sur les bords, mais j'avais oublié de mettre à jour la case d'avant (pour l'autre face du mur), du coup, comme il n'y avait pas de mur pour sortir, le monstre pouvait sortir (et pas rerentrer puisque de l'autre côté, le mur était mis).
(Ça pourra servir plus tard de manière volontaire à l’intérieur de donjon pour faire des passage secret par exemple à sens unique, mais là c'était involontaire et le monstre sortait en dehors des limites définies).
Essaye de régénérer ton donjon avec les versions fournis dans le zip (nouveau, modification des murs pour éviter les salles fermées et faire le donjon comme tu veux puis sauvegarder) puis réessaye, en principe, tu n'auras plus d'erreur


Dernière édition par Jicehel le Dim 11 Déc 2011 - 12:25, édité 2 fois
Revenir en haut Aller en bas
bignono

bignono


Nombre de messages : 1127
Age : 66
Localisation : Val de Marne
Date d'inscription : 13/11/2011

Générateur / editeur de donjon (les débuts) - Page 2 Empty
MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Générateur / editeur de donjon (les débuts) - Page 2 EmptyDim 11 Déc 2011 - 6:29

Bonjour Jicehel,

C'est très bien ton prog, Il tourne sans problème.
Il faut que tu supprimes dans l'interface de combat "Rouge:Héro/Bleu: Squelette animé" ou mettre autre chose à la place, car cela porte à confusion, ton ennemi étant tout habillé en rouge.
J'attends la suite avec impatience... Very Happy
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Générateur / editeur de donjon (les débuts) - Page 2 Empty
MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Générateur / editeur de donjon (les débuts) - Page 2 EmptyDim 11 Déc 2011 - 11:16

Bonnes remarques Smile La prochaine étape sera le fichier de définition des monstres (nom des images / caractéristiques). Je pense que je programmerai un peu ce soir
Revenir en haut Aller en bas
Contenu sponsorisé





Générateur / editeur de donjon (les débuts) - Page 2 Empty
MessageSujet: Re: Générateur / editeur de donjon (les débuts)   Générateur / editeur de donjon (les débuts) - Page 2 Empty

Revenir en haut Aller en bas
 
Générateur / editeur de donjon (les débuts)
Revenir en haut 
Page 2 sur 2Aller à la page : Précédent  1, 2
 Sujets similaires
-
» Mes débuts en 3D
» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
» des debuts sans pretention
» Editeur EliP 5 : Tiny éditeur Panoramic
» générateur de QCM

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: A l'aide!-
Sauter vers: