1;;----------------------------------------------------------------------------
2;; pgroup -- one type of npc within an npc party type
3(define (pgroup-mk npct dice)
4  (list 'pgroup npct dice))
5(define (pgroup-npct pgrp) (cadr pgrp))
6(define (pgroup-dice pgrp) (caddr pgrp))
7(define (pgroup-size pgrp)
8  (define (loop n sum)
9    ;;(println "  pgroup-size loop n=" n "sum=" sum)
10    (if (= n 0)
11        sum
12        (loop (- n 1)
13              (+ sum (max 0 (kern-dice-roll (pgroup-dice pgrp))))
14              )))
15  (loop (min 3
16             (max 1
17                  (length (filter is-alive?
18                                  (kern-party-get-members (kern-get-player))))))
19        0)
20  )
21(define (pgroup-generate pgrp)
22  ;;(println " pgroup-generate")
23  (define (loop n)
24    ;;(println "  n=" n)
25    (if (<= n 0)
26        nil
27        (cons (mk-npc (pgroup-npct pgrp) (calc-level))
28              (loop (- n 1)))))
29  (loop (pgroup-size pgrp)))
30
31;;----------------------------------------------------------------------------
32;; ptype -- npc party type
33(define (ptype-mk name sprite faction dc scarce . groups)
34  (list 'ptype sprite faction groups name dc scarce nil))
35(define (ptype-sprite ptype) (cadr ptype))
36(define (ptype-faction ptype) (caddr ptype))
37(define (ptype-groups ptype) (cadddr ptype))
38(define (ptype-name ptype) (list-ref ptype 4))
39(define (ptype-dc ptype) (list-ref ptype 5))
40(define (ptype-scarcity ptype) (list-ref ptype 6))
41(define (ptype-vehicle-type-tag ptype) (list-ref ptype 7))
42(define (ptype-set-vehicle-type-tag! ptype vtag)
43  (set-car! (list-tail ptype 7) vtag))
44(define (ptype-generate ptype)
45  ;;(println "ptype-generate")
46  (let ((kparty (kern-mk-party)))
47    (kern-being-set-name kparty (ptype-name ptype))
48    (kern-obj-set-sprite kparty (ptype-sprite ptype))
49    (kern-being-set-base-faction kparty (ptype-faction ptype))
50    (map (lambda (pgroup)
51           (map (lambda (kchar)
52                  (kern-party-add-member kparty kchar))
53                (pgroup-generate pgroup)))
54         (ptype-groups ptype))
55    (let ((vtag (ptype-vehicle-type-tag ptype)))
56      ;;(println "vtag=" vtag)
57      (if (not (null? vtag))
58          (kern-party-set-vehicle kparty
59                                  (mk-vehicle (eval vtag)))))
60    kparty
61    ))
62
63;;----------------------------------------------------------------------------
64;; mk-npc-party
65(define (mk-npc-party ptype-tag)
66  (ptype-generate (eval ptype-tag)))
67
68;;----------------------------------------------------------------------------
69;; NPC PARTY TYPES
70(define forest-goblin-party-l1
71  (ptype-mk "goblin stalker" s_fgob_stalker faction-forest-goblin 1 2
72            (pgroup-mk 'forest-goblin-stalker "1")
73            ))
74(define forest-goblin-party-l2
75  (ptype-mk "goblin scouting party" s_fgob_archer faction-forest-goblin 2 2
76            (pgroup-mk 'forest-goblin-stalker "1")
77            (pgroup-mk 'forest-goblin-hunter  "1")
78            ))
79
80(define forest-goblin-party-l3
81  (ptype-mk "goblin hunting party" s_fgob_archer faction-forest-goblin 3 2
82            (pgroup-mk 'forest-goblin-stalker "1d2")
83            (pgroup-mk 'forest-goblin-hunter  "1d2")
84            (pgroup-mk 'wolf "1d2")
85            ))
86(define forest-goblin-party-l4
87  (ptype-mk "goblin tribe"  s_fgob_civilian faction-forest-goblin 4 2
88            (pgroup-mk 'forest-goblin-stalker "1d2")
89            (pgroup-mk 'forest-goblin-hunter  "1d2")
90            (pgroup-mk 'wolf "1d2")
91            (pgroup-mk 'forest-goblin-shaman "1")
92            ))
93(define bandit-party-l1
94  (ptype-mk "gang of footpads" s_brigand faction-outlaw 1 4
95            (pgroup-mk 'footpad "1d2")
96            ))
97(define bandit-party-l2
98  (ptype-mk "gang of bandits" s_brigand faction-outlaw 2 4
99            (pgroup-mk 'bandit "1d2")
100            ))
101(define bandit-party-l3
102  (ptype-mk "a gang of highwaymen" s_brigand faction-outlaw 3 4
103            (pgroup-mk 'highwayman "1d2")
104            ))
105(define bandit-party-l4
106  (ptype-mk "a gang of blackguards" s_brigand faction-outlaw 4 4
107            (pgroup-mk 'blackguard "1d2")
108            ))
109(define bandit-party-l5
110  (ptype-mk "a gang of sinister blackguards" s_brigand faction-outlaw 5 4
111            (pgroup-mk 'blackguard "1d2")
112            (pgroup-mk 'bomber "1d2")
113            ))
114(define pirate-party-l3
115  (ptype-mk "crew of pirates" s_brigand faction-outlaw 3 5
116            (pgroup-mk 'highwayman "1d2")
117            ))
118(ptype-set-vehicle-type-tag! pirate-party-l3 't_ship)
119(define pirate-party-l4
120  (ptype-mk "crew of pirates" s_brigand faction-outlaw 3 5
121            (pgroup-mk 'blackguard "1d2")
122            ))
123(ptype-set-vehicle-type-tag! pirate-party-l4 't_ship)
124(define troll-party-l3
125  (ptype-mk "band of trolls" s_troll faction-troll 3 5
126            (pgroup-mk 'troll "1")
127            ))
128(define troll-party-l4
129  (ptype-mk "band of trolls with goblin slaves" s_troll faction-troll 4 5
130            (pgroup-mk 'troll "1")
131            (pgroup-mk 'forest-goblin-stalker "1d3-1")
132            ))
133(define green-slime-party-l2
134  (ptype-mk "ooze of slimes" s_slime faction-monster 2 3
135            (pgroup-mk 'green-slime "1d3")
136            ))
137(define yellow-slime-party-l3
138  (ptype-mk "yellow slime colony" s_yellow_slime faction-monster 3 3
139            (pgroup-mk 'green-slime "1d3")
140            (pgroup-mk 'yellow-slime "1")
141            ))
142(define fire-slime-party-l4
143  (ptype-mk "fire slime colony" s_red_slime faction-monster 4 3
144            (pgroup-mk 'fire-slime "1d2")
145            ))
146(define hydra-party-l5
147  (ptype-mk "hydra with slimes" s_hydra faction-monster 5 3
148            (pgroup-mk 'green-slime "1d3")
149            (pgroup-mk 'yellow-slime "1d2")
150            (pgroup-mk 'hydra "1")
151            ))
152
153(define dryad-party-l3
154  (ptype-mk "dryad grove" s_reaper faction-monster 3 5
155            (pgroup-mk 'dryad "1")
156            ))
157
158(define dryad-party-l4
159  (ptype-mk "dryad grove with wolves" s_reaper faction-monster 4 5
160            (pgroup-mk 'dryad "1")
161            (pgroup-mk 'wolf "1d3")
162            ))
163
164(define dryad-party-l5
165  (ptype-mk "dryad grove with shamans" s_reaper faction-monster 5 5
166            (pgroup-mk 'dryad "1")
167            (pgroup-mk 'forest-goblin-shaman "1d3")
168            ))
169
170(define wolf-party-l1
171  (ptype-mk "wolf pack" s_wolf faction-monster 2 5
172            (pgroup-mk 'wolf "1")
173            ))
174
175(define wolf-party-l2
176  (ptype-mk "wolf pack" s_wolf faction-monster 2 5
177            (pgroup-mk 'wolf "1d3")
178            ))
179
180(define skeleton-party-l2
181  (ptype-mk "skeleton brigade" s_skeleton faction-monster 2 5
182            (pgroup-mk 'skeletal-warrior "1")
183            ))
184
185(define skeleton-party-l3
186  (ptype-mk "skeleton brigade" s_skeleton faction-monster 3 5
187            (pgroup-mk 'skeletal-warrior "1")
188            (pgroup-mk 'skeletal-spear-thrower "1")
189            ))
190(define skeleton-party-l4
191  (ptype-mk "skeleton brigade" s_skeleton faction-monster 4 5
192            (pgroup-mk 'skeletal-warrior "1d2")
193            (pgroup-mk 'skeletal-spear-thrower "1d3")
194            ))
195(define skeleton-pirates-l4
196  (ptype-mk "crew of cursed pirates" s_skeleton faction-monster 4 5
197            (pgroup-mk 'skeletal-warrior "1d2")
198            (pgroup-mk 'skeletal-spear-thrower "1d3")
199            ))
200(ptype-set-vehicle-type-tag! skeleton-pirates-l4 't_ship)
201
202(define lich-party-l5
203  (ptype-mk "lich with undead servants" s_lich faction-monster 5 5
204            (pgroup-mk 'lich "1")
205            (pgroup-mk 'skeletal-warrior "1d2")
206            (pgroup-mk 'skeletal-spear-thrower "1d3")
207            ))
208
209(define wisp-party-l5
210  (ptype-mk "swarm of wisps" s_wisp faction-none 5 5
211            (pgroup-mk 'wisp "1d3")
212            ))
213
214(define ghast-party
215  (ptype-mk "haunt of ghasts" s_ghost faction-monster 1 2
216            (pgroup-mk 'ghast "1d3")
217            ))
218
219(define dragon-party-l6
220  (ptype-mk "lone dragon" s_dragon_party faction-monster 6 1
221            (pgroup-mk 'dragon "1")
222            ))
223
224(define dragon-party-l7
225  (ptype-mk "dragon with cave goblins" s_dragon_party faction-monster 7 1
226            (pgroup-mk 'dragon "1")
227            (pgroup-mk 'cave-goblin-berserker "1d2")
228            (pgroup-mk 'cave-goblin-slinger "1d2")
229            (pgroup-mk 'cave-goblin-priest "1")
230            ))
231
232(define dragon-party-l8
233  (ptype-mk "flock of dragons" s_dragon_party faction-monster 8 1
234            (pgroup-mk 'dragon "1d3")
235            ))
236
237(define gint-party-l4
238  (ptype-mk "gint scouting party" s_gint_party faction-gint 4 5
239            (pgroup-mk 'gint-warrior "1")
240            ))
241
242(define gint-party-l5
243  (ptype-mk "gint hunting party" s_gint_party faction-gint 5 5
244            (pgroup-mk 'gint-warrior "1")
245            (pgroup-mk 'cave-goblin-slinger "1d2")
246            (pgroup-mk 'wolf "1d2")
247            ))
248
249(define gint-party-l6
250  (ptype-mk "gint war party" s_gint_party faction-gint 6 3
251            (pgroup-mk 'gint-warrior "1d2")
252            (pgroup-mk 'troll "1d2")
253            (pgroup-mk 'cave-goblin-slinger "1d3")
254            (pgroup-mk 'wolf "1d2")
255            ))
256
257(define kraken-party-l3
258  (ptype-mk "school of kraken" s_kraken faction-monster 3 5
259            (pgroup-mk 'kraken "1d2")
260            ))
261
262(define sea-serpent-party-l3
263  (ptype-mk "school of sea serpents" s_sea_serpent faction-monster 3 5
264            (pgroup-mk 'sea-serpent "1d2")
265            ))
266
267(define nixie-party-l2
268  (ptype-mk "school of nixies" s_nixie_spear faction-monster 2 3
269            (pgroup-mk 'nixie-swordsman "1d2")
270            (pgroup-mk 'nixie-spearman "1d2-1")
271            ))
272
273(define nixie-party-l3
274  (ptype-mk "school of nixies with kraken" s_kraken faction-monster 3 5
275            (pgroup-mk 'nixie-swordsman "1d2")
276            (pgroup-mk 'nixie-spearman "1d2")
277            (pgroup-mk 'kraken "1")
278            ))
279
280(define nixie-party-l4
281  (ptype-mk "school of nixies with kraken" s_kraken faction-monster 3 5
282            (pgroup-mk 'nixie-swordsman "1d2")
283            (pgroup-mk 'nixie-spearman "1d2")
284            (pgroup-mk 'kraken "1")
285            ))
286
287(define nixie-party-l5
288  (ptype-mk "school of nixies with sea serpent" s_sea_serpent faction-monster 4 5
289            (pgroup-mk 'nixie-swordsman "1d2")
290            (pgroup-mk 'nixie-spearman "1d2")
291            (pgroup-mk 'sea-serpent "1")
292            ))
293
294(define spider-party-l3
295  (ptype-mk "clutch of spiders" s_spider faction-spider 3 5
296            (pgroup-mk 'giant-spider "1d2")
297            ))
298
299(define spider-party-l4
300  (ptype-mk "clutch of spiders" s_spider faction-spider 4 5
301            (pgroup-mk 'giant-spider "1d2")
302            (pgroup-mk 'queen-spider "1")
303            ))
304(define headless-party-l1
305  (ptype-mk "headless horror" s_headless faction-monster 1 4
306            (pgroup-mk 'headless "1")))
307(define headless-party-l3
308  (ptype-mk "mob of headless horrors" s_headless faction-monster 3 4
309            (pgroup-mk 'headless "1d2")))
310(define headless-party-l5
311  (ptype-mk "warlock with headless horrors" s_wizard faction-monster 5 4
312            (pgroup-mk 'headless "1d2")
313            (pgroup-mk 'warlock "1")
314            ))
315
316(define accursed-party-l4
317  (ptype-mk "accursed master" s_wizard faction-accursed 4 2
318            (pgroup-mk 'accursed-master "1")
319            (pgroup-mk 'accursed-apprentice "1d2-1")
320            (pgroup-mk 'accursed-guardian "1d2")
321            ))
322(define accursed-party-l5
323  (ptype-mk "accursed master" s_wizard faction-accursed 5 2
324            (pgroup-mk 'accursed-master "1")
325            (pgroup-mk 'accursed-defender "1d2")
326            ))
327(define accursed-party-l6
328  (ptype-mk "accursed adept" s_wizard faction-accursed 6 2
329            (pgroup-mk 'accursed-master "1")
330            (pgroup-mk 'accursed-defender "1d2")
331            (pgroup-mk 'accursed-templar "1d2")
332            ))
333(define militia-party-l4
334  (ptype-mk "squad of deserters" s_guard faction-outlaw  4 4
335            (pgroup-mk 'halberdier "1d2")
336            (pgroup-mk 'crossbowman "1d2-1")
337            ))
338
339(define snake-party-l1
340  (ptype-mk "rave of snakes" s_snake faction-monster 1 5
341            (pgroup-mk 'snake "1d2")
342            ))
343(define bat-party-l1
344  (ptype-mk "cloud of bats" s_bat faction-monster 1 1
345            (pgroup-mk 'bat "1d2")
346            ))
347
348(define rat-party-l1
349  (ptype-mk "pack of rats" s_rat faction-monster 5 5
350            (pgroup-mk 'rat "1d2")
351            ))
352
353(define griffin-party-l3
354  (ptype-mk "pride of griffins" s_griffin faction-monster 3 5
355            (pgroup-mk 'griffin "1d2")
356            ))
357
358(define insect-party-l1
359  (ptype-mk "cloud of insects" s_insects faction-monster 1 5
360            (pgroup-mk 'insect "1d3")
361            ))