Kaynağa Gözat

init versionning

nas 3 yıl önce
işleme
636ed67594
8 değiştirilmiş dosya ile 3770 ekleme ve 0 silme
  1. 55
    0
      dice.js
  2. 25
    0
      display.js
  3. 804
    0
      l5r.js
  4. 273
    0
      l5r_data.js
  5. 1996
    0
      names.js
  6. 51
    0
      players.js
  7. 149
    0
      random_utils.js
  8. 417
    0
      roll.html

+ 55
- 0
dice.js Dosyayı Görüntüle

@@ -0,0 +1,55 @@
1
+var roll = Array();
2
+roll[1] = [1, 2, 3, 4, 5, 6, 7, 8, 9];
3
+roll[2] = [1, 2, 3, 4, 5, 6, 7, 8, 9];
4
+roll[3] = [1, 2, 3, 4, 5, 6, 7, 8, 9];
5
+roll[4] = [1, 2, 3, 4, 5, 6, 7, 8, 9];
6
+roll[5] = [1, 2, 3, 4, 5, 6, 7, 8, 9];
7
+roll[6] = [1, 2, 3, 4, 5, 6, 7, 8, 9];
8
+roll[7] = [1, 2, 3, 4, 5, 6, 7, 8, 9];
9
+roll[8] = [1, 2, 3, 4, 5, 6, 7, 8, 9];
10
+roll[9] = [1, 2, 3, 4, 5, 6, 7, 8, 9];
11
+roll[1][1] = [5, 8, 9, 3, 11, 4, 7, 9, 1, 5, 3, 1, 3, 1, 6, 4, 3, 5, 9, 2, 1, 3, 5, 4];
12
+roll[2][1] = [9, 7, 12, 9, 8, 9, 8, 16, 2, 9, 4, 8, 6, 8, 9, 16, 16, 8, 7, 4, 11, 5, 8, 17];
13
+roll[3][1] = [17, 9, 12, 9, 7, 19, 9, 4, 12, 9, 8, 14, 7, 8, 7, 9, 7, 19, 9];
14
+roll[4][1] = [];
15
+roll[5][1] = [];
16
+roll[6][1] = [];
17
+roll[7][1] = [];
18
+roll[8][1] = [];
19
+roll[9][1] = [];
20
+roll[2][2] = [25, 15, 15, 13, 10, 19, 9, 7, 7, 12, 12, 11, 10, 25, 8, 12, 5, 14, 5, 6, 15];
21
+roll[3][2] = [];
22
+roll[4][2] = [25, 15, 27, 9, 23, 18, 9, 15, 18, 18, 12, 12, 44, 12, 22, 25, 10, 14, 8, 14, 27, 25] ;
23
+roll[5][2] = [];
24
+roll[6][2] = [];
25
+roll[7][2] = [];
26
+roll[8][2] = [];
27
+roll[9][2] = [];
28
+roll[3][3] = [];
29
+roll[4][3] = [];
30
+roll[5][3] = [];
31
+roll[6][3] = [25, 29, 29, 17, 26, 26, 19, 32, 52, 25, 18, 24, 34, 28, 47, 21, 16, 20, 49, 14, 21, 37];
32
+roll[7][3] = [26, 32, 29, 32, 31, 28, 25, 37, 23, 35, 20, 32, 24, 44, 40, 19, 14, 22, 43, 44];
33
+roll[8][3] = [];
34
+roll[9][3] = [];
35
+roll[4][4] = [];
36
+roll[5][4] = [];
37
+roll[6][4] = [];
38
+roll[7][4] = [];
39
+roll[8][4] = [21, 30, 37, 56, 29, 39, 28, 24, 40, 36];
40
+roll[9][4] = [];
41
+roll[5][5] = [];
42
+roll[6][5] = [];
43
+roll[7][5] = [];
44
+roll[8][5] = [];
45
+roll[9][5] = [];
46
+roll[6][6] = [];
47
+roll[7][6] = [];
48
+roll[8][6] = [];
49
+roll[9][6] = [];
50
+roll[7][7] = [];
51
+roll[8][6] = [];
52
+roll[9][6] = [];
53
+roll[8][8] = [];
54
+roll[9][8] = [];
55
+roll[9][9] = [];

+ 25
- 0
display.js Dosyayı Görüntüle

@@ -0,0 +1,25 @@
1
+function capitalize( str ) {
2
+    return str.charAt(0).toUpperCase() + str.slice(1);
3
+}
4
+
5
+function toHeader(array){
6
+    let resultat = document.createElement("tr");
7
+
8
+    for(let i = 0; i < array.length ; i++ ){
9
+        let cell = document.createElement("th");
10
+        cell.innerText = array[i];
11
+        resultat.appendChild( cell );
12
+    }
13
+    return resultat;
14
+}
15
+
16
+function display(html_id, data){
17
+    let anchor = document.getElementById( html_id ) ;
18
+    let resultat = document.createElement( "table" );
19
+
20
+    let header = toHeader( Object.keys(data) );
21
+
22
+    for(let i = 0 ; i < data.length ; i++){
23
+    }
24
+    html_id.appendChild( resultat );
25
+}

+ 804
- 0
l5r.js Dosyayı Görüntüle

@@ -0,0 +1,804 @@
1
+var stances = ["attack", "full attack", "defense", "full defense", "center"];
2
+
3
+class Characters {
4
+    constructor(){}
5
+
6
+    pool = [];
7
+    elements = ["Character", "Samourai"];
8
+
9
+    at( index ){
10
+        return this.pool[ index ];
11
+    }
12
+
13
+    elementsType = Character;
14
+
15
+    create( json ){
16
+        let charac = new Character();
17
+
18
+        if( typeof json === "Object" )
19
+            charac.fromJson( json ) ;
20
+
21
+        this.add( charac );
22
+    }
23
+    
24
+    createCharacter( aRole, gender, name, familly,experience, gempukku, skills ){
25
+        let character = new Character( aRole, gender, name, familly, school, experience, gempukku, skills );
26
+        this.add( character );
27
+    }
28
+
29
+    createSamourai( aRole, gender, name, familly, school, experience, gempukku, skills ){
30
+        let samourai = new Samourai( aRole, gender, name, familly, school, experience, gempukku, skills );
31
+        this.add( samourai );
32
+    }
33
+
34
+    fromJson( json ){
35
+
36
+        let data = JSON.parse(json);
37
+
38
+        for( prop in data){
39
+            this[ prop ] = data[ prop ];
40
+        }
41
+    }
42
+    
43
+    add(character){
44
+        if( this.elements.includes( character.constructor.name )){
45
+            this.pool.push( character );
46
+        }
47
+    }
48
+
49
+    indexOf( character ){
50
+        if(  this.elements.includes( character.constructor.name )){
51
+            for(let i = 0; i < this.pool.length ; i++){
52
+                if( character == this.pool[ i ] )
53
+                    return i;
54
+            }
55
+        }
56
+    }
57
+
58
+    getByName( name ){
59
+        for(let i = 0; i < this.pool.length ; i++){
60
+            if( this.pool[i].getName() == name)
61
+                return this.pool[i];
62
+        }
63
+    }
64
+
65
+    getIndexByName( name ){
66
+        for(let i = 0; i < this.pool.length ; i++){
67
+            if( this.pool[i].getName() == name)
68
+                return i;
69
+        }
70
+    }
71
+
72
+    size(){
73
+        return this.pool.length;
74
+    }
75
+}
76
+
77
+class Character {
78
+
79
+    constructor( aRole, skills, gender, name, experience, gempukku ){
80
+        if( aRole in roleSkills )
81
+            this.role = aRole;
82
+        else
83
+            this.role = randomFromAssociative(roleSkills);
84
+
85
+        this.gempukku = gempukku || 0;
86
+        this.stamina = (this.rank() < 1)? 1 : 2 ;
87
+        this.willpower = (this.rank() < 1)? 1 : 2 ;
88
+        this.perception = (this.rank() < 1)? 1 : 2 ;
89
+        this.strength = (this.rank() < 1)? 1 : 2 ;
90
+        this.reflexes = (this.rank() < 1)? 1 : 2 ;
91
+        this.awarness = (this.rank() < 1)? 1 : 2 ;
92
+        this.agility = (this.rank() < 1)? 1 : 2 ;
93
+        this.intelligence = (this.rank() < 1)? 1 : 2 ;
94
+        this.void = (this.rank() < 1)? 1 : 2 ;
95
+
96
+        this.skills = ( typeof skills === "object")? skills : {};
97
+        this.gender = (typeof gender !== "undefined")? gender : r_gender();
98
+        this.name = (name !== "undefined")? { "name" : name, "gender" : gender}: names.randomFromFilters([{ filter : "gender", value : this.gender },{ filter : "gender", value : "n" }]) ;
99
+        this.experience = (typeof experience === "undefined")? 25 : experience ;
100
+        this.expandedExperience = 0;
101
+        this.malus = 0 ;
102
+        this.actualizeWounds();
103
+        this.currentWounds = this.maxWounds;
104
+    }
105
+    
106
+    earth () { return ( this.stamina < this.willpower)? this.stamina : this.willpower ;}
107
+    water () { return ( this.strength < this.perception)? this.strength : this.perception ;}
108
+    air () { return ( this.reflexes < this.awarness)? this.reflexes : this.awarness ;}
109
+    fire () { return ( this.agility < this.intelligence)? this.agility : this.intelligence ;}
110
+
111
+    insight(){
112
+        let resultat = (this.earth() + this.water() + this.air() + this.fire() + this.void) * 10 ;
113
+
114
+        if(typeof this.skills == "object")
115
+        for(let i in this.skills)
116
+            resultat += parseInt(this.skills[i]);
117
+        return resultat;    
118
+    }
119
+
120
+    rank(){
121
+        let insight = this.insight();
122
+        switch( insight ){
123
+        case( !this.gempukku ):
124
+            return 0;
125
+            break;
126
+        case ( insight > 150 ):
127
+            return 1;
128
+        default :
129
+            return Math.round((insight - 125)/25);
130
+        }
131
+    }
132
+    
133
+    skills = {};
134
+    weapons = {
135
+        "wakizachi" : weapons["wakizachi"]
136
+    };
137
+
138
+    armors = [];
139
+    equippedArmor = "kimono";
140
+
141
+    equippedArrow = "willow leaf";
142
+
143
+    rollMade = {};
144
+
145
+    getTN(){
146
+        let armorTN = 0;
147
+        let modifier = 0;
148
+
149
+        switch(this.stance){
150
+        case "full attack":
151
+            modifier = -10;
152
+            break;
153
+        case "full defense":
154
+            modifier = this.rollMade["defense"];
155
+            break;
156
+        case "defense":
157
+            modifier = this.air() + this.getSkillRank( 'defense' );
158
+            break;
159
+        }
160
+        if ( typeof armors[ this.equippedArmor ].TN !== "undefined")
161
+            armorTN = armors[ this.equippedArmor ].TN;
162
+
163
+        return 5 + armorTN + (this.reflexes * 5) + modifier;
164
+    }
165
+
166
+    naturalDR = 0;
167
+
168
+    getName(){
169
+        return capitalize( this.name.familly ) + " " + capitalize( this.name.name );
170
+    }
171
+    
172
+    dr(){
173
+        let armorDR = 0;
174
+        for (var armor in this.equippedArmor)
175
+            if ( typeof armor.DR !== "undefined")
176
+                armorDR = armor.DR;
177
+
178
+        return this.naturalDR + armorDR;
179
+    }
180
+
181
+    addWeapon( weapon ){
182
+        if( typeof this.weapons[ weapon ] === "objects" )
183
+           return null;              
184
+        this.weapons[ weapon ] = weapons[ weapon ];
185
+    };
186
+
187
+    advantages = [];
188
+    addAdvantages ( newAdvantage ){
189
+        if( typeof this.advantages.find(element => element == newAdvantage ) === "undefined" ){
190
+            return null;
191
+        }
192
+        let cost;                            
193
+        for( advantage in  advantages[ newAdvantage ] )
194
+             if( this.name.familly in advantages[ newAdvantage ] ){
195
+                cost = advantages[ newAdvantage ][ this.name.familly ];
196
+             } else if ( this.clan in advantages[ newAdvantage ] ){
197
+                advantages[ newAdvantage ][ this.clan ];
198
+             } else if ( this.clan in advantages[ newAdvantage ] ){
199
+                advantages[ newAdvantage ][ this.role ];
200
+             } else {
201
+                cost = advantages[ newAdvantage ][ "default" ];
202
+             }
203
+    }
204
+
205
+    hasAdvantage( advantage){
206
+         if( typeof this.advantages.find(element => element == advantage ) === "undefined" ){
207
+            return 0;
208
+         }
209
+            return 1;
210
+    }
211
+
212
+    attack(){
213
+        let modifier_r = 0;
214
+        let modifier_k = 0;
215
+        if( this.stance = "full attack"){
216
+            modifier_r = 2;
217
+            modifier_k = 1;
218
+        }        
219
+        if( (typeof defaultAttacks === "undefined") ||
220
+            (typeof defaultAttacks.expandedExperience === "undefined") ||
221
+            (defaultAttacks.expandedExperience < this.expandedExperience)){
222
+
223
+                let attack =  Object.keys(this.updateAttacks())[0];
224
+                if( attack == "jiujutsu" ){
225
+                    return {"r" : this.strength + modifier_r, "k" : 1 + modifier_k};
226
+                }else{
227
+                    let skill =  0;
228
+                    if((skill = this.skills[ this.weapons[ attack ].skill ]) in this.skills){
229
+                        return {"r" : skill[0] + modifier_r, "k" : skill[1] + modifier_k};
230
+                    }
231
+
232
+                    return {"r" : this[skills[weapons[ attack ].skill].trait] + modifier_r, "k" : this[skills[weapons[ attack ].skill].trait] + modifier_k, "x" : 11};
233
+               }
234
+        }
235
+        return { "r" : this.defaultAttacks[ Object.keys(this.defaultAttacks)[0] ]['attack'].r + modifier_r,
236
+                 "k" : this.defaultAttacks[ Object.keys(this.defaultAttacks)[0] ]['attack'].k + modifier_k };
237
+   }
238
+
239
+    attackFromWeapon( weapon ){
240
+        let trait = parseInt( this[skills[ this.weapons[weapon].skill ].trait], 10);
241
+        let skill = parseInt( this.skills[ this.weapons[weapon].skill ], 10) || 0;
242
+        return({ "r" : trait + skill, "k" : trait, "x" : (skill)? 10: 11});
243
+    }
244
+
245
+    damageFromWeapon( weapon ){
246
+        if( weapons[ weapon ].type == "bow"){
247
+                let arrow = arrows[ this.equippedArrow ];
248
+                return {
249
+                    "r" : arrow.r + ( weapon.strength <= this.strength )? weapon.strength : this.strength,
250
+                    "k" : arrow.k}
251
+        }
252
+        return({ "r" : parseInt(this.strength, 10) +  parseInt(weapons[ weapon ].damage.split("G")[0], 10) ,
253
+                 "k" :  parseInt(weapons[ weapon ].damage.split("G")[1], 10) });
254
+    }
255
+
256
+    damage(){
257
+        if( (typeof defaultAttacks === "undefined") ||
258
+            (typeof defaultAttacks.expandedExperience === "undefined") ||
259
+            (defaultAttacks.expandedExperience < this.expandedExperience)){
260
+
261
+            let weapon = Object.keys(this.updateAttacks())[0]
262
+
263
+            if( weapon == "jiujutsu")
264
+                return {"r" : this.strength, "k" : 1};
265
+            else if( weapon.type == "bow"){
266
+                let arrow = arrows[ this.equippedArrow ];
267
+                return {
268
+                    "r" : arrow.r + ( bow_strength <= this.strength )? weapon.strength : this.strength,
269
+                    "k" : arrow.k
270
+                }
271
+            }else{
272
+                let damage = weapons[ weapon ]['damage'].split("G");
273
+                return {"r" :damage[0], "k" : damage[1]};
274
+            }
275
+        }
276
+
277
+        return  this.defaultAttacks[ (Object.keys( this.defaultAttacks)[0]) ];
278
+    }
279
+
280
+    initiative(){
281
+        return { "r" : this.rank() + this.reflexes , "k" : this.reflexes };
282
+    }
283
+    
284
+    getAttack(){
285
+        let roll = this.attack();
286
+        let modifier_r = 0;
287
+        let modifier_k = 0;
288
+        if( this.stance = "full attack"){
289
+            modifier_r = 2;
290
+            modifier_k = 1;
291
+        }
292
+        return RNG.rk10(roll.r, roll.k, this.malus);
293
+    }
294
+
295
+    getInitiative(){
296
+        let roll = this.initiative();
297
+        return RNG.rk10(roll.r, roll.k);
298
+    }
299
+
300
+    getDamage(){
301
+        let roll = this.damage();
302
+        return RNG.rk10(roll.r, roll.k);
303
+    }
304
+
305
+    getSkillRank( aSkill ){
306
+	return this.skills[ aSkill ] || 0; 
307
+    }
308
+    
309
+    allAttacks(){
310
+        let result = {};
311
+        if( "jiujutsu" in this.skills ){
312
+            result['jiujutsu'] = { "attack" : { "r" : parseInt(this.agility, 10) + parseInt(this.skills[ 'jiujutsu' ], 10), "k": this.agility }, "damage" : { "r" : this.strength, "k" : 1} };
313
+        }
314
+        for(let i in this.weapons){
315
+            result[ i ] = { "attack" : this.attackFromWeapon( i ), "damage" : this.damageFromWeapon( i ) };
316
+        }
317
+        /*(result)*/
318
+        return result;
319
+    }
320
+
321
+    attacking( charac ){
322
+        if( this.getAttack() > charac.getTN()){
323
+            charac.getWounded ( this.getDamage() );
324
+        }
325
+    }
326
+    
327
+    defaultAttacks = {};
328
+    attacks(){
329
+        if( (typeof defaultAttacks === "undefined") ||
330
+            (typeof defaultAttacks.expandedExperience === "undefined") ||
331
+            (defaultAttacks.expandedExperience < this.expandedExperience))
332
+            return this.updateAttacks();
333
+        return this.defaultAttacks[1]['attack'];
334
+    }
335
+    
336
+    updateAttacks(){
337
+        let bestAttack = 0;
338
+        let bestDamage = 0;
339
+        let attacks = this.allAttacks();
340
+
341
+        for(let i in attacks){
342
+            if( !bestAttack )
343
+                bestAttack = i ;
344
+            if( (attacks[i].k > attacks[ bestAttack ].k ) ||
345
+                ((attacks[i].k = attacks[ bestAttack ]) && (attacks[i].r < attacks[ bestAttack ].r )) ||
346
+                ( attacks[i].r < (attacks[ bestAttack ].r + 2 ))){
347
+                bestAttack = i ;
348
+            };
349
+            if( !bestDamage )
350
+                bestDamage = i ;
351
+            if( (attacks[i].k > attacks[ bestDamage ].k ) ||
352
+                ((attacks[i].k = attacks[ bestDamage ]) && (attacks[i].r < attacks[ bestDamage ]).r ) ||
353
+                ( attacks[i].r < (attacks[ bestDamage ].r + 2 ))){
354
+                bestDamage = i ;
355
+            };            
356
+            if( !bestDamage )
357
+                bestDamage = i ;
358
+        }
359
+        this.defaultAttacks[bestAttack] = attacks[ bestAttack ];
360
+        this.defaultAttacks[bestDamage] = attacks[ bestDamage ];
361
+        this.defaultAttacks['expandedExperience'] = this.expandedExperience;
362
+
363
+        return this.defaultAttacks;
364
+    }
365
+
366
+    expanseExperience( value ){
367
+        if(!this.experience){
368
+            this.experience = 0;
369
+            return 0;
370
+        }else if ( value > this.experience){
371
+            return 0;
372
+        }
373
+
374
+        if( typeof value == "undefined"){
375
+            this.experience = this.experience - 1;
376
+            this.expandedExperience = this.expandedExperience + 1;
377
+        }else{
378
+            this.experience = this.experience - value;
379
+            this.expandedExperience = this.expandedExperience + value;
380
+        }
381
+        return value || 1;
382
+    }
383
+
384
+    increaseSkill( skill ){
385
+        if(( typeof this.skills[ skill ] === "number" ) && ( this.skills[ skill ] < 10 )){
386
+            var cost = this.skills[ skill ] + 1;
387
+            if( (this.experience - cost) >= 0 ){
388
+                this.expanseExperience( cost );
389
+                return this.skills[ skill ]++;
390
+            }
391
+        } else {
392
+            if( this.experience > 0){
393
+                this.expanseExperience();
394
+                return this.skills[ skill ] = 1;
395
+            }
396
+        }
397
+        return 0;
398
+    }
399
+
400
+    increaseTrait( trait ){
401
+        let factor = ( trait == "void")? 12 : 6  ;
402
+        let cost = (this[ trait ] + 1) * factor;
403
+        this.actualizeWounds();
404
+
405
+        if(this.expanseExperience( cost ))
406
+            this[ trait ]++;
407
+    };
408
+                 
409
+    actualizeWounds(){
410
+        this.maxWounds = 17 * this.earth();
411
+        return this.fullHeal;
412
+    };
413
+
414
+    fullHeal(){
415
+        return this.currentWounds = this.maxWounds;
416
+    }
417
+    
418
+    actualizeMalus(){
419
+        switch(this.state){
420
+            case "healthy" :
421
+                 this.malus = 0;
422
+            break;
423
+            case "nicked" :
424
+                this.malus = ( this.hasAdvantage( "strength of the earth" )  )? 0 : 3 ;
425
+            break;
426
+            case "grazed" :
427
+                this.malus = ( this.hasAdvantage( "strength of the earth" )  )? 2 : 5 ;
428
+            break;
429
+            case "hurt" :
430
+                this.malus = ( this.hasAdvantage( "strength of the earth" )  )? 7 : 10 ;
431
+            break;
432
+            case "injured" :
433
+                this.malus = ( this.hasAdvantage( "strength of the earth" )  )? 12 : 15 ;
434
+            break;
435
+            case "crippled" :
436
+                this.malus = ( this.hasAdvantage( "strength of the earth" )  )? 17 : 20 ;
437
+            break;
438
+            case "down" :
439
+                this.malus = ( this.hasAdvantage( "strength of the earth" )  )? 37 : 40 ;
440
+            break;
441
+            case "out" :
442
+                this.malus = 100 ;
443
+            break;
444
+            case "dead" :
445
+                this.malus = 1000 ;
446
+            break;
447
+        }
448
+    };
449
+    
450
+    getWounded( wounds ){
451
+       let inflicted = wounds - this.dr();
452
+        this.currentWounds = this.currentWounds - inflicted;
453
+       if( this.currentWounds < 1 )
454
+            this.state = "dead";
455
+       else if( this.currentWounds < (5 * this.earth()) )
456
+            this.state = "out";
457
+       else if( this.currentWounds < (7 * this.earth()) )
458
+           this.state = "down";
459
+       else if( this.currentWounds < (9 * this.earth()) )
460
+           this.state = "crippled";
461
+       else if( this.currentWounds < (11 * this.earth()) )
462
+            this.state = "injured";
463
+       else if( this.currentWounds < (13 * this.earth()) )
464
+            this.state = "hurt";
465
+       else if( this.currentWounds < (15 * this.earth()) )
466
+            this.state = "grazed";
467
+       else if( this.currentWounds < (17 * this.earth()) )
468
+            this.state = "nicked";
469
+       else if( this.currentWounds < (7 * this.earth()) )
470
+            this.state = "healthy";                                                                                                                   
471
+       this.actualizeMalus();
472
+
473
+        return inflicted;
474
+    }
475
+
476
+    getHeal( value ){
477
+        this.currentWounds = ( value < this.maxWounds)? this.currentWounds + value : this.maxWounds;
478
+        this.actualizeMalus();
479
+    }
480
+
481
+    fullHeal(){
482
+        this.currentWounds = this.maxWounds;
483
+        this.actualizeMalus();
484
+    }
485
+
486
+    generate( level, role ){
487
+        this.role =( typeof role === "undefined" )? this.role : role ;
488
+        this.experience = 25 + Math.round(level * 30 + Math.pow(15, level/10));
489
+        this.randomTraits( level );
490
+        this.randomSkill( level );
491
+        this.armedFromSkills();
492
+    }
493
+    
494
+    getWeaponsKeyword( keyword ){
495
+       let result = [];
496
+       for(let i = 0; i < weapons.length ; i++){
497
+           if( keyword in weapons[i].keyword )
498
+               result.push( weapons[i] );
499
+       }
500
+       return result ;
501
+    }
502
+
503
+    getWeaponKeyword( keyword ){
504
+       let weapons = getWeaponsKeyword( keyword );
505
+       let hasIt = 1;
506
+       while( hasIt ){
507
+           let index = random( weapons.length );
508
+           hasIt = this.weapons[ weapons[ index ] ];
509
+           if( !hasIt )
510
+               this.weapons.push( weapons[ index ] );
511
+       }
512
+    }
513
+
514
+    getRandomWeaponFromSkill( skill ){
515
+        if( typeof skill == "unsigned") return null;
516
+        let results = {};
517
+        let atLeastOne = false;
518
+        for(let weapon in weapons){
519
+            if((typeof weapon != "undefined") && (typeof weapons[weapon].skill != "undefined")){
520
+                if(weapons[weapon].skill == skill){
521
+                    atLeastOne = true;
522
+                    results[weapon] = weapons[weapon];
523
+                }
524
+            }
525
+        }
526
+        return ( atLeastOne)? randomFromAssociative( results ) : null ;
527
+    }
528
+
529
+    getWeaponsFromSkills( skills ){
530
+        let result = {};
531
+        for(let skill in skills){
532
+            let weapon = this.getRandomWeaponFromSkill( skill );
533
+            if(weapon)
534
+                Object.assign( result, weapon );
535
+        }
536
+        return result;
537
+    }
538
+
539
+    armedFromSkills(){
540
+        Object.assign( this.weapons, this.getWeaponsFromSkills( this.skills )) ;
541
+    }
542
+
543
+    allSkills(){
544
+        let skillList = roleSkills[ this.role ];
545
+        for(let skill in skillList){
546
+            skillList[skill].occurrence *= 10;
547
+        }
548
+        return Object.assign({}, skillList, skills);
549
+    }
550
+    
551
+     randomSkill(){
552
+         let hasMain = 0;
553
+         let skill ;
554
+         let skillList = this.allSkills();
555
+         
556
+         while(  this.experience > 2 ){
557
+            skill = randomFromWeight( skillList );
558
+
559
+            if( hasMain ){
560
+                if( skill == hasMain ){
561
+                    if(!this.increaseSkill( Object.keys(skill)[0] )){
562
+                        skill = Object.keys( randomFromWeight( skillList ))[0];
563
+
564
+                        for(let i = 0 ; !this.increaseSkill( skill ) && (i < arrayLength( skillList)); i++ ){
565
+                            skill = Object.keys( randomFromWeight( skillList ))[0];
566
+                        };
567
+                    };
568
+                }
569
+            } else if( typeof skill.main !== "undefined"){
570
+                hasMain = skill;
571
+                this.increaseSkill( Object.keys(skill)[0] ) ;
572
+            } else {
573
+                this.increaseSkill( Object.keys(skill)[0] ) ;
574
+            }
575
+         }
576
+   }
577
+    
578
+    randomTraits( level ){
579
+        let pass = level * random(2) + random(2);
580
+        switch( this.role ){
581
+        case "bushi" :
582
+           while(pass){
583
+               let asset = random(3);
584
+               switch( asset ){
585
+               case 0 :
586
+                   if( this.experience >= ((6 * this.increaseTrait("stamina") + (6 * this.increaseTrait("willpower"))))){
587
+                       this.increaseTrait("willpower");
588
+                       this.increaseTrait("stamina");
589
+                   }else
590
+                       this.increaseTrait("void")
591
+               break;
592
+               case 1 :
593
+                   this.increaseTrait("strength") ;
594
+               break;
595
+               case 2 :
596
+                   this.increaseTrait("reflexes");
597
+               break;
598
+               case 3 :
599
+                   this.increaseTrait("agility");
600
+               break;
601
+              };
602
+          pass--;
603
+          }
604
+        break;
605
+        case "shugenja" :
606
+           switch( random(3) ){
607
+           case 0 :
608
+               while(pass){
609
+                   this.increaseTrait("stamina") ;
610
+                   this.increaseTrait("willpower");}
611
+            break;
612
+            case 1 :
613
+               while(pass){
614
+                   this.increaseTrait("perception");
615
+                   this.increaseTrait("strength") ;}
616
+            break;
617
+           case 2 :
618
+               while(pass){
619
+                   this.increaseTrait("reflexes") ;
620
+                   this.increaseTrait("awarness") ;}
621
+            break;
622
+            case 3 :
623
+               while(pass){
624
+                   this.increaseTrait("intelligence") ;
625
+                   this.increaseTrait("agility") ;}
626
+            break;
627
+            }
628
+       break;
629
+        case "monk" :
630
+            while(pass){
631
+               let asset = random(3);
632
+               switch( asset ){
633
+               case 0 :
634
+                   this.increaseTrait("void") ;
635
+               break;
636
+               case 1 :
637
+                   this.increaseTrait("strength") ;
638
+                   this.increaseTrait("agility");
639
+               break;
640
+               case 2 :
641
+                   this.increaseTrait("awarness");
642
+                   this.increaseTrait("reflexes");
643
+               break;
644
+               case 3 :
645
+                   this.increaseTrait("void");
646
+                   this.increaseTrait("strength");
647
+               break;
648
+              };
649
+          pass--;
650
+            }
651
+       break;
652
+       case "scout" :
653
+            while(pass){
654
+               let asset = random(2);
655
+               switch( asset ){
656
+               case 0 :
657
+                   this.increaseTrait("perception");
658
+                   this.increaseTrait("strength");
659
+               break;
660
+               case 1 :
661
+                   this.increaseTrait("agility");
662
+               break;
663
+               case 2 :
664
+                   this.increaseTrait("reflexes");
665
+               break;
666
+              };
667
+          pass--;
668
+          }
669
+           break;
670
+           case "ninja" :
671
+            while(pass){
672
+               let asset = random(2);
673
+               switch( asset ){
674
+               case 0 :
675
+                   this.increaseTrait("void")
676
+               break;
677
+               case 1 :
678
+                   this.increaseTrait("agility") ;
679
+               break;
680
+               case 2 :
681
+                   this.increaseTrait("reflexes");
682
+               break;
683
+              };
684
+          pass--;
685
+          }           
686
+       break;
687
+       }
688
+    this.actualizeWounds();
689
+    }
690
+
691
+    getWounds(){
692
+        return this.currentWounds ;
693
+    }
694
+
695
+    stance = "attack";
696
+    
697
+    switchStance( aStance ){
698
+        if( stances.includes( aStance ) ){
699
+            this.stance = aStance;
700
+	}else if( typeof aStance === "undefined" ){
701
+	    let nextStanceIndex = stances.indexOf( this.stance ) + 1;
702
+	    nextStanceIndex = (nextStanceIndex >= stances.length )? 0 : nextStanceIndex;
703
+	    this.stance = stances[ nextStanceIndex ];
704
+	}
705
+	if( this.stance == "full defense")
706
+	    this.rollMade["defense"] = this.skillRoll( "defense" ) ;
707
+    }
708
+    
709
+    skillRoll( skill ){
710
+        let skillRank = this.getSkillRank( "defense" );
711
+        let traitRank = this[ skills[skill].trait ];
712
+        return RNG.rk10( traitRank + skillRank, traitRank );
713
+    }
714
+}
715
+
716
+var RNG = new RandomGenerator(4);
717
+
718
+function characterFromJSON( json ){
719
+    let result = new Character();
720
+    let data = JSON.parse(json);
721
+
722
+    for( prop in data){
723
+        result[ prop ] = data[ prop ];
724
+    }
725
+
726
+    return result;
727
+}
728
+
729
+function fight(charac1, charac2){
730
+    let result = {
731
+        "attacker" : charac1.initiative(),
732
+        "defender" : charac2.initiative()
733
+    };
734
+    let first = (  charac1.initiative() + (charac1.water/10) > charac1.initiative() + (charac1.water()/10))? charac1 : charac2 ;
735
+    let second = ( charac1 == first)? charac2 : charac1 ;
736
+    let winner = 0
737
+    let round = 0;
738
+
739
+    while( !winner ){
740
+        round++;
741
+
742
+        result[round] = {
743
+            "attack" : {
744
+                "attacker" : first.attack(),
745
+                "defender" : second.attack()
746
+            },
747
+            "damage" : {
748
+                "attacker" : first.damage(),
749
+                "defender" : second.damage()
750
+            }
751
+        };
752
+        result[round]["wounds"] =  {
753
+                "attacker" : ( result[round]['attack']['attacker'] >= second.getTN() )? second.getWounded( result[round]['damage']['attacker'] ) : 0,
754
+                "defender" : (( result[round]['attack']['defender'] >= first.getTN() ) && second.malus < 100)? first.getWounded( result[round]['damage']['defender'] ) : 0,
755
+        }
756
+            
757
+        if( second.malus > 99 ){
758
+            winner = first;
759
+        } else if( first.malus > 99 )
760
+            winner = second;
761
+    }
762
+
763
+    result['winner'] = winner ;
764
+    result['winner_side'] = (winner == charac1)? "attacker": "defender";
765
+    return result;
766
+}
767
+
768
+class Samourai extends Character {
769
+    constructor( aRole, gender, name, familly, school, experience, gempukku, skills){
770
+        super( aRole, skills, gender, name, experience, gempukku );
771
+
772
+        this.setFamilly( familly );
773
+        this.setBasicSchool( school );
774
+        this.autoWearArmor();
775
+    }
776
+
777
+    setFamilly( familly_name ){
778
+        let familly = famillies[ familly_name ];
779
+        this[ familly.trait ]++;
780
+        this.name['familly'] = familly_name;
781
+    }
782
+
783
+    setBasicSchool( school_name ){
784
+        let school = basicSchool[ school_name ];
785
+        this[ school.trait ]++;
786
+        for(let i = 0 ; i < school.outfit.weapon.length ; i++){
787
+            let weapon = (school.outfit.weapon[ i ] == "any")? Object.keys( randomFromAssociative( weapons ) ) : school.outfit.weapon[ i ];
788
+
789
+            if( !(weapon in this.weapons) )
790
+                this.weapons[ weapon ] = weapons[ weapon ];
791
+        }
792
+        this.armors = school.outfit.armor || this.armors;
793
+    }
794
+
795
+    autoWearArmor(){
796
+        let maxArmor = "kimono";
797
+        for(let i = 0 ; i < this.armors.length ; i++){
798
+            if( armors[ this.armors[ i ] ].TN >  armors[ maxArmor ].TN ){
799
+                maxArmor = this.armors[i];
800
+            }
801
+        };
802
+        this.equippedArmor = maxArmor;
803
+    }
804
+}

+ 273
- 0
l5r_data.js Dosyayı Görüntüle

@@ -0,0 +1,273 @@
1
+var weapons = {
2
+    "wakizachi" : { "damage" : "2G2", "type" : "sword", "keywords" : ["samourai", "medium"], "skill" : "kenjutsu"},
3
+    "katana" : { "damage" : "3G2", "type" : "sword", "keywords" : ["samourai", "medium"], "skill" : "kenjutsu"},
4
+    "no-dachi" : { "damage" : "3G3", "type" : "sword", "keywords" : ["large"], "skill" : "kenjutsu"},
5
+    "scimitar" : { "damage" : "2G3", "type" : "sword", "keywords" : ["medium"], "skill" : "kenjutsu"},
6
+    "parangu" : { "damage" : "2G2", "type" : "sword", "special" : "If a parangu inflicts more than 30 Wounds in a single attack, its blade breaks.", "keywords" : ["medium", "peasant"], "skill" : "kenjutsu"},
7
+    "ninja-to" : { "damage" : "2G2", "type" : "sword", "special" : "The ninja-to is a medium weapon, but is considered a small weapon for the purposes of concealment. If a ninja-to infl icts more than 40 Wounds in a single attack, its blade breaks.",     "keywords" : ["ninja", "medium"], "skill" : "kenjutsu"},
8
+    "tetsubo" : { "damage" : "3G3", "type" : "heavy", "keywords":[], "skill" : "heavy weapon"},
9
+    "ono" : { "damage" : "0G4", "type" : "heavy", "keywords":[], "skill" : "heavy weapon"},
10
+    "masakari" : { "damage" : "2G3", "type" : "heavy", "keywords":[], "skill" : "heavy weapon"},
11
+    "dai tsuchi" : { "damage" : "5G2", "type" : "heavy", "keywords":[], "skill" : "heavy weapon"},
12
+    "kusarigama" : { "damage" : "0G2", "type" : "chain", "keywords":[], "skill" : "chain"},
13
+    "kyoketsu-shogi" : { "damage" : "0G1", "type" : "chain", "special" : "Double an opponent’s bonus to Armor TN from armor.", "keywords":[], "skill" : "chain"},
14
+    "manrikikusari" : { "damage" : "1G1", "type" : "chain", "keywords":[], "skill" : "chain"},
15
+    "yumi" : { "strength" : "3", "type" : "bow", "special" : "Increase the TN of all attack rolls by +10 if used from horseback.", "keywords":[], "skill" : "kyujutsu"},
16
+    "han-kyu" : { "strength" : "1", "type" : "bow", "special" : "Increase the TN of all attack rolls by +10 if used from horseback.", "keywords":[], "skill" : "kyujutsu"},
17
+    "dai-kyu" : { "strength" : "4", "type" : "bow", "special" : "Increase the TN of all attack rolls by +10 by foot. Only 3 strength needed", "keywords":[], "skill" : "kyujutsu"},
18
+    "nagamaki" : { "damage" : "2G3", "type" : "polearm", "keywords":[], "skill" : "polearm"},
19
+    "naginata" : { "damage" : "3G2", "type" : "polearm", "keywords" : ["samourai"], "skill" : "polearm"},
20
+    "sasumata" : { "damage" : "0G2", "type" : "polearm", "special" : "The sasumata may be used to initiate and maintain a grapple.", "keywords":[], "skill" : "polearm"},
21
+    "sodegarami" : { "damage" : "1G1", "type" : "polearm", "special" : "The sodegarami may be used to initiate and maintain a grapple.", "keywords":[], "skill" : "polearm"},
22
+    "bisento" : { "damage" : "3G3", "type" : "polearm", "keywords":[], "skill" : "polearm"},
23
+    "kumade" : { "damage" : "1G1", "type" : "spear", "special" : "If a kumade inflicts more than 25 Wounds in a single attack, it breaks.", "keywords" : [ "large", "peasant" ], "skill" : "spear"},
24
+    "lance" : { "damage" : "3G2", "type" : "spear", "special" : "The listed DR only applies if the lance is used from horseback and used to make an attack directly following a Move Action. Under any other circumstances, it possesses DR 1k2. Using the lance in melee combat without a Move Action increases the TN of all attack rolls by +5 on horseback and +10 on foot. A lance shatters if it infl icts more than 30 Wounds in one attack.", "keywords":[], "skill" : "spear"},
25
+    "nage-yari" : { "damage" : "1G2", "type" : "spear", "special" : "The nage-yari may be thrown accurately up to 50’", "keywords":[], "skill" : "spear"},
26
+    "yari" : { "damage" : "2G2", "type" : "spear", "special" : "The yari can be thrown a maximum range of 30’, and has DR 1k2 when thrown.", "keywords":[], "skill" : "spear"},
27
+    "bo" : { "damage" : "1G2", "type" : "stave", "keywords":[], "skill" : "stave"},
28
+    "nunchaku" : { "damage" : "1G2", "type" : "stave", "keywords" : ["peasant", "small"], "skill" : "stave"},
29
+    "tonfa" : { "damage" : "0G3", "type" : "stave", "keywords" : ["peasant", "large"], "skill" : "stave"},
30
+    "bo" : { "damage" : "1G2", "type" : "stave", "keywords":[], "skill" : "stave"},
31
+    "tanto" : { "damage" : "1G1", "type" : "knives", "keywords" : ["small"], "skill" : "knive"},
32
+    "sai" : { "damage" : "1G1", "type" : "knives", "keywords" : ["small"], "skill" : "knive"},
33
+    "kama" : { "damage" : "0G2", "type" : "knives", "keywords" : ["peasant", "small"], "skill" : "knive"},
34
+    "war fan" : { "damage" : "0G1", "type" : "small", "keywords":["small"], "skill" : "knive"},
35
+    "oyomi" : { "damage" : "4G2", "type" : "small", "keywords":["small"], "skill" : "crossbow"}    
36
+};
37
+
38
+var armors = {
39
+    "kimono" : { "DR" : 0, "TN": 0},
40
+    "ashigaru" : {"DR" : 1, "TN": 3},
41
+    "light" : {"DR" : 3, "TN": 5},
42
+    "heavy" : {"DR" : 5, "TN": 10},
43
+    "ridding" : {"DR" : 4, "TN": 4}
44
+};
45
+
46
+var advantages = {
47
+    "strength of the earth" : { "default" : 3, "bushi" : 2, "ninja" : 2, "scout" : 2 }
48
+};
49
+
50
+var roleSkills = {
51
+    "courtier" : { "courtier" : { "occurence" : 10, "trait" : "intelligence"},
52
+                   "etiquette" : { "occurence" : 10, "trait" : "awarness"},
53
+                   "sincerity" : { "occurence" : 10, "trait" : "awarness"},
54
+                   "lore : heraldy" : { "occurence" : 5, "trait" : "intelligence"},
55
+                   "tea ceremony" : { "occurence" : 5, "trait" : "void"},
56
+                   "lore : theology" : { "occurence" : 4, "trait" : "intelligence"},
57
+                   "lore : history" : { "occurence" : 4, "trait" : "intelligence"},
58
+                   "lore : bushido" : { "occurence" : 3, "trait" : "intelligence" }},
59
+    "bushi" : { "kenjutsu" : { "occurence" :10, "main" : true, "trait" : "agility"},
60
+                "iaijutsu" : { "occurence" : 8, "main" : true, "trait" : "reflexes"},
61
+                "heavy weapon" : { "occurence" : 8, "main" : true, "trait" : "agility"},
62
+                "polearm" : { "occurence" : 7, "main" : true, "trait" : "agility"},
63
+                "defense" : {  "occurence" : 7, "trait" : "reflexes"},
64
+                "kyujutsu": { "occurence" : 6, "main" : true, "trait" : "reflexes"},
65
+                "jiujutsu": { "occurence" : 5, "trait" : "agility"},
66
+                "battle" : { "occurence" : 5, "trait" : "perception"},
67
+                "athletics": {  "occurence" : 4, "trait" : "strength" }},
68
+    "monk" : { "jiujutsu": { "occurence" : 7, "main" : true, "trait" : "agility"},
69
+               "staves": { "occurence" : 6, "main" : true, "trait" : "agility"},
70
+               "lore : theology" : { "occurence" :6, "trait" : "intelligence"},
71
+               "meditation": { "occurence" : 6, "trait" : "void"},
72
+               "chain": { "occurence" : 3, "main" : true, "trait" : "agility"}},
73
+    "scout" : { "kenjutsu" : { "occurence" :8, "main" : true, "trait" : "agility"},
74
+                "kyujutsu": { "occurence" : 7, "main" : true,"trait" : "reflexes"},
75
+                "athletics": {  "occurence" : 6, "trait" : "strength" },
76
+                "heavy weapon" : { "occurence" : 6, "main" : true, "trait" : "agility"},
77
+                "polearm" : { "occurence" : 6, "main" : true, "trait" : "agility"},
78
+                "stealth" : {  "occurence" : 6 , "trait" : "agility"},
79
+                "battle" : { "occurence" : 6, "trait" : "perception"},
80
+                "defense" : {  "occurence" : 5 , "trait" : "reflexes"},
81
+                "iaijutsu" : { "occurence" : 4, "main" : true, "trait" : "reflexes"},
82
+                "jiujutsu": { "occurence" : 3, "trait" : "agility"}},
83
+    "ninja" : { "stealth" : {  "occurence" : 10 , "trait" : "agility"},
84
+                "knives": { "occurence" : 8, "main" : true,"trait" : "agility", "type" : "bugei"},
85
+                "kenjutsu" : {  "occurence" : 6 , "main" : true, "trait" : "agility"},
86
+                "sincerity" : {  "occurence" : 5 , "trait" : "awarness"},
87
+                "ninjutsu" : {  "occurence" : 3 , "main" : true,"trait" : "agility"},
88
+                "jiujutsu" : {  "occurence" : 3 , "trait" : "agility"},
89
+                "staves" : {  "occurence" : 3 , "trait" : "agility"}
90
+              }
91
+};
92
+
93
+var skills = {
94
+    "perform" : { "occurence" : 1, "trait" : "awarness", "type" : "high"},
95
+    "courtier" : { "occurence" : 2, "trait" : "intelligence",  "type" : "high"},
96
+    "etiquette" : { "occurence" : 2, "trait" : "awarness",  "type" : "high"},
97
+    "sincerity" : { "occurence" : 2, "trait" : "awarness",  "type" : "high"},
98
+    "acting" : { "occurence" : 1, "trait" : "awarness",  "type" : "high"},
99
+    "artisan" : { "occurence" : 1, "trait" : "awarness",  "type" : "high"},
100
+    "calligraphy" : { "occurence" : 1, "trait" : "intelligence",  "type" : "high"},
101
+    "investigation" : { "occurence" : 1, "trait" : "perception",  "type" : "high"},
102
+    "medicine" : { "occurence" : 1, "trait" : "awarness",  "type" : "high"},
103
+    "spellcraft" : { "occurence" : 1, "trait" : "awarness",  "type" : "high"},
104
+    "lore : heraldy" : { "occurence" : 1, "trait" : "intelligence",  "type" : "high"},
105
+    "tea ceremony" : { "occurence" : 2, "trait" : "void", "type" : "high"},
106
+    "lore : theology" : { "occurence" : 1, "trait" : "intelligence",  "type" : "high"},
107
+    "lore : history" : { "occurence" : 1, "trait" : "intelligence",  "type" : "high"},
108
+    "lore : bushido" : { "occurence" : 2, "trait" : "intelligence" ,  "type" : "high"},
109
+    "battle" : { "occurence" : 2, "trait" : "perception", "type" : "bugei"},
110
+    "heavy weapon" : { "occurence" : 1, "main" : true, "trait" : "agility"},    
111
+    "defense" : {  "occurence" : 2 , "trait" : "reflexes", "type" : "bugei"},
112
+    "iaijutsu" : { "occurence" : 2, "main" : true, "trait" : "reflexes", "type" : "bugei"},
113
+    "jiujutsu": { "occurence" : 2, "trait" : "agility", "type" : "bugei"},
114
+    "kenjutsu" : { "occurence" : 2, "main" : true, "trait" : "agility", "type" : "bugei"},
115
+    "polearm" : { "occurence" : 1, "main" : true, "trait" : "agility", "type" : "bugei"},
116
+    "kyujutsu": { "occurence" : 1, "main" : true,"trait" : "reflexes", "type" : "bugei"},
117
+    "chain": { "occurence" : 1, "main" : true,"trait" : "agility", "type" : "bugei"},
118
+    "stave": { "occurence" : 1, "main" : true,"trait" : "agility", "type" : "bugei"},
119
+    "spear": { "occurence" : 1, "main" : true,"trait" : "agility", "type" : "bugei"},    
120
+    "knive": { "occurence" : 1, "main" : true,"trait" : "agility", "type" : "bugei"},    
121
+    "crossbow": { "occurence" : 1, "main" : true,"trait" : "agility", "type" : "gaijin"},    
122
+    "swordmanship": { "occurence" : 1, "main" : true,"trait" : "agility", "type" : "gaijin"},
123
+    "athletics": {  "occurence" : 1, "trait" : "strength", "type" : "bugei"},
124
+    "horsemanship": {  "occurence" : 1, "trait" : "strength", "type" : "bugei"},
125
+    "hunting": {  "occurence" : 1, "trait" : "strength", "type" : "bugei"},
126
+    "animal handling": {  "occurence" : 1, "trait" : "awarness", "type" : "merchant"},
127
+    "commerce": {  "occurence" : 1, "trait" : "intelligence", "type" : "merchant"},
128
+    "engineering": {  "occurence" : 1, "trait" : "intelligence", "type" : "merchant"},
129
+    "craft": {  "occurence" : 1, "trait" : "", "type" : "merchant"},
130
+    "intimidation" : {  "occurence" : 1 , "trait" : "awarness", "type" : "low"},
131
+    "temptation" : {  "occurence" : 1 , "trait" : "awarness", "type" : "low"},
132
+    "sleight of hand" : {  "occurence" : 1 , "trait" : "agility", "type" : "low"},
133
+    "stealth" : {  "occurence" : 1 , "trait" : "agility", "type" : "low"}
134
+};
135
+
136
+var famillies = {
137
+    "daidodji" : { "clan" : "crane", "trait" : "willpower"} ,
138
+    "tamori" : { "clan" : "dragon", "trait" : "willpower" },
139
+    "hida" : { "clan" : "crab", "trait" : "strength"},
140
+    "matsu" : { "clan" : "lion", "trait" : "strength"},
141
+    "hiruma" : { "clan" : "crab", "trait" : "agility"},
142
+    "kakita" : { "clan" : "crane", "trait" : "agility"},
143
+    "mirumoto" : { "clan" : "dragon", "trait" : "agility"},
144
+    "kuni" : { "clan" : "crab", "trait" : "intelligence"},
145
+    "kaiu" : { "clan" : "crab", "trait" : "intelligence"},
146
+    "asahina" : { "clan" : "crane", "trait" : "intelligence"},
147
+    "kitsu" : { "clan" : "lion", "trait" : "intelligence"},
148
+    "yasuki" : { "clan" : "crab", "trait" : "awarness"},
149
+    "doji" : { "clan" : "crane", "trait" : "awarness"},
150
+    "kitsuki" : { "clan" : "dragon", "trait" : "awarness"},
151
+    "ikoma" : { "clan" : "lion", "trait" : "awarness"},
152
+    "kitsune" : { "clan" : "mantis", "trait" : "awarness"},
153
+    "moshi" : { "clan" : "mantis", "trait" : "intelligence"},
154
+    "tsuruchi" : { "clan" : "mantis", "trait" : "perception"},
155
+    "yoritomo" : { "clan" : "mantis", "trait" : "stamina"},    
156
+    "togashi order" : { "clan" : "dragon", "trait" : "void"},
157
+    "agasha" : { "clan" : "phœnix", "trait" : "agility"},
158
+    "asako" : { "clan" : "phœnix", "trait" : "awarness"},
159
+    "isawa" : { "clan" : "phœnix", "trait" : "willpower"},
160
+    "shiba" : { "clan" : "phœnix", "trait" : "perception"},
161
+    "bayushi" : { "clan" : "scorpion", "trait" : "agility"},
162
+    "shosuro" : { "clan" : "scorpion", "trait" : "awareness"},
163
+    "soshi" : { "clan" : "scorpion", "trait" : "intelligence"},
164
+    "yogo" : { "clan" : "scorpion", "trait" : "willpower"},
165
+    "horiuchi" : { "clan" : "unicorn", "trait" : "willpower"},
166
+    "ide" : { "clan" : "unicorn", "trait" : "perception"},
167
+    "iuchi" : { "clan" : "unicorn", "trait" : "intelligence"},
168
+    "moto" : { "clan" : "unicorn", "trait" : "agility"},
169
+    "shinjo" : { "clan" : "unicorn", "trait" : "reflexes"},
170
+    "utaku" : { "clan" : "unicorn", "trait" : "stamina"},
171
+    "chuda" : { "clan" : "spider", "trait" : "intelligence"},
172
+    "daigotsu" : { "clan" : "spider", "trait" : "stamina"},
173
+    "goju" : { "clan" : "spider", "trait" : "agility"},
174
+    "spider monks" : { "clan" : "spider", "trait" : "reflexes"},
175
+    "ichiro" : { "clan" : "badger", "trait" : "strength"},
176
+    "komori" : { "clan" : "bat", "trait" : "intelligence"},
177
+    "heichi" : { "clan" : "boar", "trait" : "willpower"},
178
+    "tonbo" : { "clan" : "dragonfly", "trait" : "awareness"},
179
+    "toritaka" : { "clan" : "falcon", "trait" : "perception"},
180
+    "kitsune" : { "clan" : "fox", "trait" : "willpower"},
181
+    "usagi" : { "clan" : "hare", "trait" : "awareness"},
182
+    "ujina" : { "clan" : "hare", "trait" : "agility"},
183
+    "toku" : { "clan" : "monkey", "trait" : "stamina"},
184
+    "fuzake" : { "clan" : "monkey", "trait" : "perception"},
185
+    "tsi" : { "clan" : "oriole", "trait" : "strength"},
186
+    "morito" : { "clan" : "ox", "trait" : "stamina"},
187
+    "chuda" : { "clan" : "snake", "trait" : "willpower"},
188
+    "suzume" : { "clan" : "sparrow", "trait" : "awareness"},
189
+    "kasuga" : { "clan" : "tortoise", "trait" : "perception"},
190
+    "miya" : { "clan" : "imperial", "trait" : "reflexes"},
191
+    "otomo" : { "clan" : "imperial", "trait" : "intelligence"},
192
+    "seppun" : { "clan" : "imperial", "trait" : "agility"},
193
+    "sons of the mountain tribe" : { "clan" : "geijin", "trait" : "agility"},
194
+    "daughters of the flame" : { "clan" : "geijin", "trait" : "agility"}
195
+};
196
+
197
+var basicSchool = {
198
+    "hida bushi" : { "clan" : "crabe", "trait" : "stamina", "outfit" : {"armor" : ["light", "heavy"], "weapon" : ["heavy", "polearm", "katana", "wakizachi"]}},
199
+    "mirumoto bushi" : { "clan" : "dragon", "trait" : "stamina", "outfit" : {"armor" : [ "ashigaru", "light" ], "weapon" : ["any", "wakizachi", "katana"]}},
200
+    "tamori shugenja" : { "clan" : "lion", "trait" : "stamina"},
201
+    "kuni shugenja" : { "clan" : "crab", "trait" : "willpower"},
202
+    "hiruma bushi" : { "clan" : "crab", "trait" : "willpower", "outfit" : {"armor" : [ "ashigaru", "light" ], "weapon" : ["bow", "wakizachi", "katana", "tanto"]}},
203
+    "yasuki courtier" : { "clan" : "crab", "trait" : "perception"},
204
+    "kitsuki" : { "clan" : "dragon", "trait" : "perception", "outfit" : {"weapon" : ["wakizachi"]}},
205
+    "akodo bushi" : { "clan" : "lion", "trait" : "perception", "outfit" : {"armor" : [ "ashigaru", "light" ], "weapon" : ["bow", "wakizachi", "katana", "tanto"]}},
206
+    "kitsu shugenja" : { "clan" : "lion", "trait" : "perception"},
207
+    "matsu berserker" : { "clan" : "lion", "trait" : "strength", "outfit" : {"armor" : [ "heavy", "light" ], "weapon" : ["heavy", "wakizachi", "katana", "polearm"]}},
208
+    "kakita bushi" : { "clan" : "crane", "trait" : "reflexes"},
209
+    "asahina shugenja" : { "clan" : "crane", "trait" : "awarness"},
210
+    "doji courtier" : { "clan" : "crane", "trait" : "awarness"},
211
+    "daidodji iron warrior" : { "clan" : "crane", "trait" : "agility"},
212
+    "ikoma bard" : { "clan" : "lion", "trait" : "intelligence"},
213
+    "togashi tattooed order" : { "clan" : "dragon", "trait" : "void"},
214
+    "yoritomo bushi" : { "clan" : "mantis", "trait" : "strength", "outfit" : {"armor" : [ "ashigaru", "light" ], "weapon" : ["wakizachi", "katana", "any"]}},
215
+    "moshi shugenja" : { "clan" : "mantis", "trait" : "awarness"},
216
+    "yoritomo courtier" : { "clan" : "mantis", "trait" : "willpower"},
217
+    "tsuruchi archer" : { "clan" : "mantis", "trait" : "reflexes", "outfit" : {"armor" : [ "ashigaru", "light" ], "weapon" : ["bow", "wakizachi"]}},
218
+    "shiba" : { "clan" : "phœnix", "trait" : "agility", "outfit" : {"armor" : [ "light" ], "weapon" : ["any", "wakizachi", "katana", "tanto"]}},
219
+    "isawa shugenja" : { "clan" : "phœnix", "trait" : "intelligence"},
220
+    "asako loremaster" : { "clan" : "phœnix", "trait" : "intelligence"},
221
+    "agasha shugenja" : { "clan" : "phœnix", "trait" : "intelligence"},
222
+    "asako henshin" : { "clan" : "phœnix", "trait" : "willpower", "outfit" : { "weapon": ["wakizachi"]}},
223
+    "bayushi bushi" : { "clan" : "scorpion", "trait" : "intelligence", "outfit" : {"armor" : [ "light" ], "weapon" : ["any", "wakizachi", "katana"]}},
224
+    "soshi shugenja" : { "clan" : "scorpion", "trait" : "awareness"},
225
+    "bayushi courtier" : { "clan" : "scorpion", "trait" : "awarenes"},
226
+    "shosuro infiltrator" : { "clan" : "scorpion", "trait" : "reflexes"},
227
+    "moto" : { "clan" : "unicorn", "trait" : "strength", "outfit" : {"armor" : [ "riding", "heavy" ], "weapon" : ["wakizachi", "katana", "polearm", "heavy", "any"]}},
228
+    "iuchi shugenja" : { "clan" : "unicorn", "trait" : "perception"},
229
+    "ide emissary" : { "clan" : "unicorn", "trait" : "awareness"},
230
+    "utaku" : { "clan" : "unicorn", "trait" : "reflexes", "outfit" : {"armor" : ["riding", "light" ], "weapon" : ["any", "wakizachi", "katana"]}},
231
+    "meishodo shugenja" : { "clan" : "unicorn", "trait" : "stamina", "outfit" : { "weapon" : ["wakizachi", "tanto"], "koku" : 4}},
232
+    "daigotsu bushi" : { "clan" : "spider", "trait" : "strength"},
233
+    "chuda shugenja" : { "clan" : "spider", "trait" : "willpower"},
234
+    "daigotsu courtier" : { "clan" : "spider", "trait" : "perception"},
235
+    "order of the spider monk" : { "clan" : "spider", "trait" : "agility"},
236
+    "ichiro bushi" : { "clan" : "badger", "trait" : "strength"},
237
+    "komori shugenja" : { "clan" : "bat", "trait" : "awareness"},
238
+    "heichi bushi" : { "clan" : "boar", "trait" : "strength"},
239
+    "tonbo" : { "clan" : "dragonfly", "trait" : "perception"},
240
+    "toritaka" : { "clan" : "falcon", "trait" : "strength"},
241
+    "kitsune shugenja" : { "clan" : "fox", "trait" : "stamina"},
242
+    "usagi bushi" : { "clan" : "hare", "trait" : "reflexes"},
243
+    "toku bushi" : { "clan" : "monkey", "trait" : "willpower"},
244
+    "tsi smith" : { "clan" : "oriole", "trait" : "intelligence"},
245
+    "morito bushi" : { "clan" : "ox", "trait" : "agility"},
246
+    "chuda shugenja" : { "clan" : "snake", "trait" : "willpower"},
247
+    "suzume bushi" : { "clan" : "sparrow", "trait" : "willpower"},
248
+    "kasuga smuggler" : { "clan" : "tortoise", "trait" : "awareness"},
249
+    "seppun guardman" : { "clan" : "imperial", "trait" : "perception"},
250
+    "seppun shugenja" : { "clan" : "imperial", "trait" : "intelligence"},
251
+    "otomo courtier" : { "clan" : "imperial", "trait" : "awareness"},
252
+    "miya herald" : { "clan" : "imperial", "trait" : "awareness"},
253
+    "the four temple" : { "clan" : "monk", "trait" : "awareness"},
254
+    "the order of heroes" : { "clan" : "monk", "trait" : "perception"},
255
+    "the shrine of the seven thunder" : { "clan" : "monk", "trait" : "stamina"},
256
+    "the temple of kaimetsu-uo" : { "clan" : "monk", "trait" : "willpower"},
257
+    "the temple of osano-wo" : { "clan" : "monk", "trait" : "strength"},
258
+    "the temple of thousand fortunes" : { "clan" : "monk", "trait" : "agility"},
259
+    "disciples of sun tao" : { "clan" : "ronin", "trait" : "reflexes"},
260
+    "forest killers" : { "clan" : "ronin", "trait" : "agility"},
261
+    "tawagoto's army" : { "clan" : "ronin", "trait" : "agility"},
262
+    "tengoku's justice" : { "clan" : "ronin", "trait" : "strength"},
263
+    "tessen" : { "clan" : "ronin", "trait" : "stamina"},
264
+    "void mystic" : { "clan" : "ronin", "trait" : "willpower", "outfit" : { "weapon" : ["any", "wakizachi"], "koku" : 1}}
265
+};
266
+
267
+var arrows = {
268
+    "willow leaf" : { "r" : 2, "k" : 2, "range" : 1, "armorTN_m" : 1, "price" : 0.2},
269
+    "rope cutter" : { "r" : 1, "k" : 1, "range" : 0.50, "armorTN_m" : 1, "price" : 0.75},
270
+    "humming bulb" : { "r" : 0, "k" : 1, "range" : 1, "armorTN_m" : 1, "price" : 1},
271
+    "flesh cutter" : { "r" : 2, "k" : 3, "range" : 0.50, "armorTN_m" : 2, "price" : 1},
272
+    "armor piercing" : {"r" : 1, "k" : 1, "range" : 1, "armorTN_m" : 0, "price" : 0.2}
273
+};

+ 1996
- 0
names.js
Dosya farkı çok büyük olduğundan ihmal edildi
Dosyayı Görüntüle


+ 51
- 0
players.js Dosyayı Görüntüle

@@ -0,0 +1,51 @@
1
+var characters = new Characters();
2
+
3
+characters.createSamourai( "courtier", "m", "takahashi", "kitsuki", "kitsuki", 0, 0);
4
+characters.createSamourai( "bushi", "m", "kaji", "mirumoto", "mirumoto bushi", 0, 0);
5
+characters.createSamourai( "monk", "m", "kiyoshi", "asako", "asako henshin", 0, 0, { "calligraphy" : 1, "jiujutsu" : 1, "lore: theology": 1, "sincerity" : 1, "meditation" : 1, "medecine" : 1});
6
+characters.createSamourai( "shugenja",  "f", "", "tamori", "void mystic", 0, 0, { "calligraphy" : 1, "defense" : 1, "medecine" : 1, "spellcraft" : 1 });
7
+characters.createSamourai( "shugenja",  "f", "honami", "utaku", "meishodo shugenja", 0, 0, { "calligraphy" : 1, "craft: meishodo" : 1, "spellcast (research)" : 1, "kenjutsu" : 1 }) ;
8
+
9
+for(let j = 0 ; j < characters.size() ; j++){
10
+    characters.at(j).experience = 39;
11
+
12
+    switch( characters.at(j).name.familly ){
13
+    case "utaku":
14
+        characters.at(j).increaseTrait("willpower");
15
+        characters.at(j).increaseTrait("willpower");
16
+        break;
17
+    case "tamori" :
18
+        characters.at(j).increaseTrait("void");
19
+        characters.at(j).increaseTrait("void");
20
+        characters.at(j).increaseSkill("calligraphy");
21
+        characters.at(j).increaseSkill("defense");
22
+        characters.at(j).increaseSkill("medecine");
23
+        characters.at(j).increaseSkill("spellcraft");
24
+        break;
25
+    case "asako" :
26
+        characters.at(j).increaseSkill("willpower");
27
+        characters.at(j).increaseSkill("agility");
28
+        characters.at(j).increaseSkill("intelligence");
29
+        characters.at(j).increaseSkill("jiujutsu");
30
+        characters.at(j).increaseSkill("lore: theology");
31
+        characters.at(j).increaseSkill("meditation");
32
+        break;
33
+    case "mirumoto":
34
+        characters.at(j).increaseTrait("agility");
35
+        characters.at(j).increaseTrait("agility");
36
+        characters.at(j).increaseTrait("void");
37
+        break;
38
+    case "kitsuki":
39
+        characters.at(j).increaseTrait("reflexe");
40
+        characters.at(j).increaseTrait("intelligence");
41
+        characters.at(j).increaseSkill("investigation");
42
+        break;
43
+    }
44
+        
45
+}
46
+
47
+characters.createSamourai( "bushi",  "f", "", "sons of the mountain tribe", "mirumoto bushi", 0, 0, { "knives" : 2 }) ;
48
+characters.createSamourai( "bushi",  "f", "", "sons of the mountain tribe", "mirumoto bushi", 0, 0, { "swordwanship" : 2 }) ;
49
+characters.createSamourai( "bushi",  "f", "", "sons of the mountain tribe", "mirumoto bushi", 0, 0, { "crossbow" : 2 }) ;
50
+characters.createSamourai( "bushi",  "f", "", "daughters of the flame", "mirumoto bushi", 0, 0, { "crossbow" : 2 }) ;
51
+    

+ 149
- 0
random_utils.js Dosyayı Görüntüle

@@ -0,0 +1,149 @@
1
+
2
+class RandomGenerator{
3
+
4
+    constructor( cache ){
5
+        this.rng = new Uint8Array( cache  );
6
+        this.index = cache-- ;
7
+        this.generate();
8
+    }
9
+
10
+    generate(){
11
+        window.crypto.getRandomValues(this.rng);
12
+        this.index = this.rng.length - 2;
13
+        return  this.rng.length - 1;
14
+    }
15
+
16
+    next(){
17
+        return (this.index < 0)? this.generate() : this.index--;
18
+    }
19
+
20
+    rand(){
21
+        return this.rng[ this.next() ]/256 ;
22
+    }
23
+    
24
+    get( max, min ){
25
+        min = ( typeof min === "number")? min : 0 ;
26
+        return Math.round(this.rand() * (max - min) + min);
27
+    }
28
+
29
+    roll10( explode ){
30
+        explode = ( typeof explode === "number")? explode : 10;
31
+        let dice = this.get( 10, 1 );
32
+        return  (dice >= explode)? 10 + this.roll10( explode ) : dice ;
33
+    }
34
+
35
+    rk10( r, k, malus, explode ){
36
+        let rolls = [];
37
+        if((typeof r === "unigned") || (typeof k === "unigned"))
38
+            return 0;
39
+        malus = ( typeof malus === "unsigned")? 0 : malus ;
40
+        for(let i = 0 ; i < r ; i++)
41
+            rolls[i] = this.roll10( explode);
42
+        sort( rolls );
43
+        return rolls.slice( 0, k ).reduce((a, b) => a + b) - (malus || 0);
44
+    }
45
+}
46
+
47
+function sort( array ){
48
+    let temp = 0;
49
+    var unsorted = true ;
50
+    while(unsorted){
51
+        unsorted = false;
52
+        for(let i = 0; i < array.length -1 ; i++){
53
+            if(array[ i ] < array[ i + 1 ]){
54
+               temp = array[ i ];
55
+               array[ i ] = array[ i + 1 ];
56
+               array[ i + 1 ] = temp;
57
+               unsorted =  true;
58
+           }
59
+       }
60
+    }
61
+}
62
+
63
+function sortAssociative( array_arg ){
64
+    let result = {};
65
+    let array = array_arg;
66
+    let higher = 1;
67
+    while( !higher ){
68
+        higher = 0;
69
+        for(let i in array){
70
+            higher = (higher)?
71
+                (array[higher] < array[i])? i : higher : i ;
72
+            if(array[ i ] < array[ i + 1 ]){
73
+                temp = array[ i ];
74
+                array[ i ] = array[ i + 1 ];
75
+                array[ i + 1 ] = temp;
76
+                unsorted =  true;
77
+            }
78
+        }
79
+        if(higher){
80
+            result.push(higher);
81
+            delete array[ higher ];
82
+            higher = 0;
83
+        }
84
+    }
85
+    return result;
86
+}
87
+
88
+
89
+function random( max, min ){
90
+    min = (typeof min == "undefined")? 0 : min;
91
+    return Math.floor(Math.random() * (max - min + 1) + min);
92
+}
93
+
94
+function r_gender(){
95
+    return (random(1))? "f": "m";
96
+}
97
+
98
+function arrayAt( index, array ){
99
+    let i = 0;
100
+    let result = {};
101
+    for(let obj in array){
102
+        if( index == ++i ){
103
+            result[obj] = array[obj];
104
+            return result;
105
+        }
106
+    }
107
+}
108
+
109
+function arrayAtWeight( index, array ){
110
+    let i = 0;
111
+    for(let obj in array){
112
+        if(( i <= index ) && ( index <= (i + array[obj].occurence))){
113
+            let rs = {};
114
+            rs[ obj ] = array[obj];
115
+            return rs;
116
+        }
117
+        i += array[obj].occurence ;
118
+    }
119
+    return null;
120
+}
121
+
122
+function arrayLength( array ){
123
+    let i = 0;
124
+    for(let obj in array){
125
+        i++;
126
+    };
127
+    return i;
128
+}
129
+
130
+function arrayWeight( array ){
131
+    let i = 0;
132
+    for(let obj in array){
133
+        i += array[obj].occurence;
134
+    };
135
+    return i;
136
+}
137
+
138
+function randomFromAssociative( array ){
139
+    return arrayAt( random( arrayLength( array ), 1), array) ;
140
+}
141
+
142
+function randomFromArray( array ){
143
+    return array[ random( arrayLength( array )) ] ;
144
+}
145
+
146
+function randomFromWeight( array ){
147
+    return arrayAtWeight( random( arrayWeight( array )), array) ;
148
+}
149
+

+ 417
- 0
roll.html Dosyayı Görüntüle

@@ -0,0 +1,417 @@
1
+<html>
2
+  <head>
3
+    <meta charset="utf8">
4
+    <script src="dice.js"></script>
5
+    <script src="names.js"></script>    
6
+    <script src="l5r_data.js"></script>
7
+    <script src="random_utils.js"></script>
8
+    <script src="display.js"></script>        
9
+    <script src="l5r.js"></script>
10
+    <script src="players.js"></script>
11
+    <script>
12
+
13
+    var npcs = [];
14
+    var result = [];
15
+    var result1 = [];
16
+    var result2 = [];
17
+    var current_target= 0;
18
+
19
+    function target(){
20
+        return characters.at(current_target) ;
21
+    }
22
+    
23
+    var npc_summary = document.getElementById("npc.summary");           
24
+    function characterToLine(){
25
+        let line = document.CreateElement('td');
26
+        let cell = document.CreateElement('tr');
27
+    }
28
+    
29
+    function generateNPC(){
30
+        var newNPC = new Character();
31
+        newNPC.generate( document.getElementById("npc-level").value );
32
+        return newNPC;
33
+    }
34
+
35
+    function generateNPCs( size ){
36
+        let result = [];
37
+    
38
+        for(let i = 0; i < size ; i++){
39
+            result[i] = generateNPC( i );
40
+        }
41
+
42
+        return result;
43
+    }
44
+    
45
+    function skirmish( size ){
46
+        let npcs = generateNPCs( size );
47
+
48
+        for(let i = 0; i < size ; i+=2){
49
+            if( (npcs[i]) && (npcs[i + 1]))
50
+                result[i] = fight(npcs[i], npcs[i + 1]);
51
+        }
52
+
53
+        for( let i = 0; i < size ; i++ ){
54
+            ;
55
+        }    
56
+    }
57
+
58
+    function swissContest( size ){
59
+        let result = [];
60
+        let npcs = generateNPCs( size );
61
+
62
+        for(let i = 0; i < npcs.length; i++){
63
+             result[i] = [];
64
+                           
65
+            for(let j = 0; j < npcs.length; j++){
66
+                result[i][j] = ( fight( npcs[i], npcs[j] ) );
67
+                npcs[i].fullHeal();
68
+                npcs[j].fullHeal();
69
+            }
70
+        }
71
+        return result;
72
+    }
73
+
74
+    function winRateSwissContest( array, stat){
75
+        let result = [];
76
+
77
+        for(let i = 0; i < array.length; i++){
78
+            let winrate = 0;
79
+            let total = 0;
80
+            for(let j = 0; j < array[i].length; j++){
81
+                winrate += ( array[i][j].winner_side == "attacker" )? 1: 0;
82
+                total++;
83
+            }
84
+
85
+            result[i] = winrate/total;
86
+        }
87
+        return result; 
88
+    }
89
+
90
+    function hasClass( elem, className){
91
+
92
+        for( let i = 0 ; i < elem.classList.length ; i++ )
93
+            if( elem.classList[ i ] === className )
94
+                return elem;
95
+
96
+        return 0;
97
+    };
98
+                               
99
+    function getClassFromList( list, className ){
100
+        let result = [];
101
+
102
+        for( let i = 0 ; i < list.childNodes.length   ; i++ )
103
+            if( hasClass( list.childNodes[ i ], className ))
104
+                 result.push( list.childNodes[ i ] );
105
+
106
+        return result;
107
+    }
108
+
109
+    function inputFromElementList( list, input_type ){
110
+        let result = [];
111
+
112
+        for( let i = 0 ; i ; i++ )
113
+            if( list[ i ].getAttributeNames().includes( input_type ))
114
+                result.push( list[i] );
115
+
116
+        return result;
117
+    }
118
+
119
+    function display_data( data, anchor ){
120
+        let html_display = document.getElementById( anchor );
121
+        let headers = [ "name", "initiative", "TN", "attack", "damage", "wounds" ];
122
+        let hs = document.createElement("tr");
123
+
124
+                               
125
+        for(let i = 0; i < headers.length ; i++){
126
+            let h = document.createElement("th");
127
+            h.innerText = headers[ i ];
128
+            hs.appendChild( h );
129
+        }
130
+
131
+        html_display.appendChild( hs ) ;
132
+
133
+        for(let i = 0;  i < data.length ; i++){
134
+            let line = document.createElement( "tr" );
135
+            line.setAttribute("id", i + "-" + anchor );
136
+            let name = document.createElement("td");
137
+            name.innerText = data[i]["get"+capitalize( headers[0] )]();
138
+            line.appendChild( name );
139
+
140
+            for(let j = 1; j <  headers.length ; j++){
141
+                let cell = document.createElement("td");
142
+                let button = document.createElement("button");
143
+                button.setAttribute("class", headers[j]);
144
+                let id = i + "-"+j+"-" + anchor;
145
+
146
+                button.innerText = headers[j];
147
+
148
+                button.addEventListener('click', function(event) {
149
+                   document.getElementById( id ).value = data[i]["get"+capitalize( headers[j] )]();
150
+                });
151
+                cell.appendChild( button );
152
+
153
+                let result = document.createElement("input");
154
+                result.setAttribute("id", id);
155
+                result.setAttribute("type", "text");
156
+                result.setAttribute("class", "result");
157
+                cell.appendChild( result );
158
+                line.appendChild( cell );
159
+            }
160
+            let cell1 = document.createElement("td");
161
+            let targeted = document.createElement("input");
162
+            targeted.setAttribute("type", "checkbox");
163
+            targeted.setAttribute("class", "targeted");
164
+            targeted.checked = false;
165
+            targeted.addEventListener('click', function(event) {
166
+               let targeteds = document.getElementsByClassName( "targeted" );
167
+               for(let targeted in targeteds){
168
+                   if(targeteds[targeted] != this)
169
+                                targeteds[targeted].checked = false;
170
+
171
+                   current_target = this.parentNode.parentNode.id.split("-")[0];
172
+               }
173
+            });
174
+            cell1.appendChild( targeted );
175
+            line.appendChild( cell1 );
176
+
177
+            cell2 = document.createElement("td");
178
+            let attacking = document.createElement("input");
179
+            attacking.setAttribute("type", "button");
180
+            attacking.setAttribute("class", "attacking");
181
+            attacking.value = "Attack";
182
+            attacking.checked = false;
183
+            attacking.addEventListener('click', function(event) {
184
+                characters.at( this.parentNode.parentNode.id.split("-")[0] ).attacking( target() );
185
+                triggerField( "Wounds" );
186
+                triggerField( "TN" );
187
+            });
188
+            cell2.appendChild( attacking );
189
+            line.appendChild( cell2 );
190
+	    
191
+	    let cell_switchStance = document.createElement("td");
192
+	    let switchStance = document.createElement("input");
193
+            switchStance.setAttribute("type", "button");
194
+	    switchStance.value = "Attack Stance";
195
+	    cell_switchStance.appendChild( switchStance );
196
+	    cell_switchStance.addEventListener('click', function(event) {
197
+                let charac = characters.at( this.parentNode.id.split("-")[0] );
198
+		charac.switchStance();
199
+		event.target.value = charac.stance;
200
+		triggerField( "TN" );
201
+            });	    
202
+            line.appendChild( cell_switchStance );
203
+
204
+            html_display.appendChild( line );
205
+        }
206
+    }
207
+
208
+    function popAssociativeMaker( associative, anchor ){
209
+    
210
+        let result = document.createElement( "div" );
211
+        result.setAttribute( "class", "popup" );
212
+        let exit = document.createElement("input");
213
+        exit.setAttribute("type", "button");
214
+        exit.setAttribute("class", "exit");  
215
+        exit.value = "×";
216
+        exit.addEventListener('click', function(event) {
217
+            anchor.value = JSON.stringify( formToData( result ) );
218
+            result.parentNode.removeChild( result );
219
+         });
220
+
221
+        result.appendChild( exit );
222
+
223
+        for( let i in associative ){
224
+            switch( typeof varType ){
225
+            case "function":
226
+            break;
227
+            case "object":
228
+                result.appendChild( inputField( i, associative[ i ] || "", true, null, function(event) {
229
+                    this.value =  popObjectMaker( associative[ i ], line );
230
+                } ));
231
+            break;
232
+            default:
233
+                result.appendChild( inputField( i, associative[ i ] || "") );
234
+            }
235
+        }
236
+
237
+        let add = document.createElement("input");
238
+        add.setAttribute("type", "button");
239
+        add.setAttribute("class", "add");  
240
+        add.value = "+";
241
+        add.addEventListener('click', function(event) {
242
+            result.appendChild( inputField( "", "", true) );
243
+        });
244
+        result.appendChild( add );
245
+                                
246
+        document.getElementsByTagName('body')[0].appendChild( result );
247
+
248
+        return result;
249
+    }
250
+
251
+    function inputField( field, value, modifiable, label_onclick, input_onclick ){
252
+         field = (( typeof field === "unsigned" ) || !field )? "" : field;
253
+         value = (( typeof value === "unsigned" ) || !value )? "" : value;
254
+         modifiable = (( typeof modifiable === "unsigned" ) || !modifiable )? false : true ;
255
+
256
+         let  line= document.createElement("div");
257
+         let input = document.createElement("input");
258
+         let label ;
259
+
260
+         if( modifiable ){
261
+             label = document.createElement("input");
262
+             label.setAttribute("type", "text");                                
263
+         }else{
264
+             label = document.createElement("label");
265
+         }
266
+       
267
+         line.setAttribute("class", "line");
268
+         label.setAttribute("class", "label");
269
+         label.innerText = field;
270
+
271
+         if( label_onclick instanceof Function )
272
+             label.addEventListener('click', label_onclick );
273
+                                
274
+         line.appendChild( label );
275
+
276
+         input.setAttribute("type", "text");
277
+         input.setAttribute("class", "maker");
278
+         input.value = value;
279
+
280
+         if( input_onclick instanceof Function )
281
+             input.addEventListener('click', label_onclick );
282
+
283
+         input.checked = false;
284
+         line.appendChild( input );
285
+
286
+         return line;
287
+    }
288
+                                
289
+    function popObjectMaker( object, anchor, dictionnary ){
290
+        let prototype = new object;
291
+        let result = document.createElement( "div" );
292
+        result.setAttribute( "class", "popup" );
293
+
294
+        let exit = document.createElement("input");
295
+        exit.setAttribute("type", "button");
296
+        exit.setAttribute("class", "exit");  
297
+        exit.value = "×";
298
+
299
+        if( typeof dictionnary === "object" )
300
+            exit.addEventListener('click', function(event) {
301
+                 formToDictonnary( result, dictionnary);});
302
+        else
303
+            exit.addEventListener('click', function(event) {
304
+                 saveAndExitForm( result);});
305
+        result.appendChild( exit );
306
+                                  
307
+        for( let i in prototype ){
308
+            let varType = prototype[i];
309
+            let  line= document.createElement("div");
310
+            let input = document.createElement("input");
311
+            let label = document.createElement("label");
312
+
313
+            switch( typeof varType ){
314
+            case "function":
315
+            break;
316
+            case "object":
317
+                line= document.createElement("div");
318
+                line.setAttribute("class", "line");
319
+                label.setAttribute("type", "button");
320
+                label.classList.add("label");
321
+                label.innerText = i;
322
+                line.appendChild( label );
323
+
324
+                input.setAttribute("type", "text");
325
+                input.classList.add("json");
326
+                input.classList.add("maker");
327
+                input.value = prototype[ i ] || "";
328
+                input.checked = false;
329
+                input.addEventListener('click', function(event) {
330
+                    this.value = popAssociativeMaker( prototype[ i ], input );
331
+                });
332
+                line.appendChild( input );
333
+
334
+                result.appendChild( line );
335
+            break;
336
+            default:
337
+                line.setAttribute("class", "line");
338
+                label.setAttribute("type", "button");
339
+                label.classList.add("label");
340
+                label.innerText = i;
341
+                line.appendChild( label );
342
+
343
+                input.setAttribute("type", "text");
344
+                input.classList.add("maker");
345
+                input.value = prototype[ i ] || "";
346
+                input.checked = false;
347
+                line.appendChild( input );
348
+
349
+                result.appendChild( line );
350
+            }
351
+        }
352
+
353
+        if( anchor instanceof Element )
354
+            anchor.appendChild( result );
355
+        else
356
+            document.getElementsByTagName('body')[0].appendChild( result );
357
+
358
+       return result;
359
+    }
360
+                                  
361
+    function formToData( form ){
362
+        let lines = form.getElementsByClassName( "line" ) ;
363
+        let data = {} ;
364
+
365
+        for ( let i = 0 ; i < lines.length ; i++ ){
366
+            let labels = getClassFromList( lines[ i ], "label");
367
+            let makers = getClassFromList( lines[ i ], "maker");
368
+
369
+            if(( lines[ i ] instanceof Element ) && ( labels[0] || makers[0] )){
370
+                 let index = labels[0].value || labels[0].innerText;
371
+                 let value = makers[0].value || makers[0].innerText ;
372
+                 value = (hasClass( makers[0], "json" ))? JSON.parse( value ) : value ;
373
+                              
374
+                 data[ index ] = value ;
375
+            }
376
+        }
377
+        return data ;
378
+    }                                  
379
+                                  
380
+    function saveAndExitForm( form ){
381
+        form.value = JSON.stringify( formToData( form ) );
382
+        form.parentNode.removeChild( form );
383
+    }
384
+
385
+    function formToDictonnary( form, dictionnary){
386
+        return dictionnary.create( formToData( form ) );
387
+    }
388
+                              
389
+    function triggerField( field ){
390
+        let fields = document.getElementsByClassName( field ) ;
391
+                                
392
+        for (let i = 0 ; i < fields.length ; i++ ){
393
+            fields[i].click();
394
+        }
395
+    }
396
+
397
+    function main(){
398
+        display_data( characters.pool, "players_summary");
399
+        triggerField( "wounds" );
400
+        triggerField( "TN" );        
401
+    }
402
+    </script>
403
+    <style>
404
+      .result{
405
+          width : 3em;
406
+      }
407
+    </style>
408
+  </head>
409
+  <body onload="main()">
410
+    <button onclick="popObjectMaker( Character )">Créer un Personnage</button>
411
+    <table id="players_summary"></div>
412
+    <div id="npc_summary"></div>
413
+    </table>
414
+    <button onclick="generateNPC()">Générer NPC</button><input id="npc-level" type="number" value="1"/><select id="npc-role"></select>
415
+    <button onclick="popObjectMaker( Character, null, characters )">Générer Personnage</button>
416
+  </body>
417
+</html>

Loading…
İptal
Kaydet