1;;----------------------------------------------------------------------------
2;; Morphologies
3;;
4;; Slots should be listed in desired paper-doll rendering order, bottom layer
5;; to top.
6(define humanoid
7  (list
8   slot-armor
9   slot-boot
10   slot-helm
11   slot-amulet
12   slot-ring
13   slot-ring
14   slot-weapon-or-shield
15   slot-weapon-or-shield
16   ))
17
18(define giant
19  (list
20   slot-armor
21   slot-boot
22   slot-helm
23   slot-helm
24   slot-amulet
25   slot-amulet
26   slot-ring
27   slot-ring
28   slot-weapon-or-shield
29   slot-weapon-or-shield
30   slot-weapon-or-shield
31   slot-weapon-or-shield
32   ))
33
34;;----------------------------------------------------------------------------
35;; species
36
37(define (rel-spd speed)
38	(/ (* speed-human speed) 100))
39
40;; mk-species -- register a species type with the kernel
41(define (mk-species tag name str int dex spd con mag vr mmode weap morph xp sspr armordice mvsnd)
42  (kern-mk-species tag name str int dex (rel-spd spd) vr mmode
43                   con
44                   (max (round (/ con 10)) 1)
45                   mag
46                   (max (round (/ mag 2)) 1)
47                   sspr
48                   weap #t sound-damage
49                   mvsnd
50                   xp
51                   #f ;; stationary?
52                   armordice
53                   morph nil))
54
55(define (mk-stationary-species tag name str int dex spd con mag vr mmode weap morph xp sspr armordice)
56  (kern-mk-species tag name str int dex (rel-spd spd) vr mmode
57                   con
58                   (max (round (/ con 10)) 1)
59                   mag
60                   (max (round (/ mag 2)) 1)
61                   sspr
62                   weap #t sound-damage
63                   nil
64                   xp
65                   #t ;; stationary?
66                   armordice
67                   morph nil))
68
69;; Note: SF Bug# [ 1523228 ] "AI not moving to attack" was almost certainly
70;; caused by the limited vision radius of most species not reaching across the
71;; 19x19 combat map. This is intentional, I think the player should have the
72;; opportunity to escape some NPC's or sneak up on others because the foe's
73;; vision is handicapped. However, this is not the situation for sea battles,
74;; where most player character's won't be able to close with distant sea
75;; critters. So make all sea creatures have at least 19 vision radius, but
76;; leave the rest as-is.
77
78;; st = strength, in = intelligence, dx = dexterity (10 is human average)
79;; spd = AP per turn (speed-human is a common value)
80;; bHP = basis for max HP   (max HP = bHP + level * bHP/10)
81;; bMP = basis for max Mana (max MP = bMP + level * bMP/10)
82;; vr = vision radius (0..19)
83;;          tag                 name             st in dx   spd bHP bMP  vr mmode           weap         morph    xp sspr               armrdc  mvsnd
84(mk-species 'sp_balron          "balron"         50 50 50   100  50  10  13 mmode-fly       t_horns      giant    50 s_asleep           nil     sound-walking   )
85(mk-species 'sp_bull            "bull"           20  1  5   100  20   0   6 mmode-walk      t_horns      nil       2 s_bull             nil     sound-walking   )
86(mk-species 'sp_cave_goblin     "cave goblin"    12  8 12   100  12   2  14 mmode-walk      t_hands      humanoid  2 s_asleep           nil     sound-walking   )
87(mk-species 'sp_forest_goblin   "forest goblin"   8 10 14   100   8   4  16 mmode-walk      t_hands      humanoid  2 s_asleep           nil     sound-walking   )
88(mk-species 'sp_ghast           "ghast"          10 10 10   100  10   2   8 mmode-phase     t_hands      humanoid  2 s_asleep           nil     nil             )
89(mk-species 'sp_gint            "gint"           50  3  8   100  50   2  20 mmode-large     t_hands      giant    10 s_asleep           nil     sound-walking   )
90(mk-species 'sp_green_slime     "green slime"     2  2  2   100   6   0   5 mmode-walk      t_acid_spray nil       2 s_slime_asleep     nil     sound-squishing )
91(mk-species 'sp_fire_slime      "fire slime"      2  2  2   100   6   0   5 mmode-walk      t_fire_glob  nil       2 s_red_slime_asleep nil     sound-squishing )
92(mk-species 'sp_human           "human"          10 10 10   100  10   2  13 mmode-walk      t_hands      humanoid  2 s_asleep           nil     sound-walking   )
93(mk-species 'sp_insect          "insects"         1  1 18   200   3   0   4 mmode-hover     t_stinger    nil       1 nil                nil     nil             )
94(mk-species 'sp_nixie           "nyad"           10 10 10   100  10   2  19 mmode-fish      t_hands      humanoid  2 s_shoals           nil     sound-splashing )
95(mk-species 'sp_queen_spider    "queen spider"   18  6 12   100  20   4  10 mmode-crawl     t_G_fangs    nil       4 s_asleep           "1d2"   sound-walking   )
96(mk-species 'sp_skeleton        "skeleton"       12  8 12   100  12   2  10 mmode-walk      t_hands      humanoid  3 s_asleep           nil     sound-walking   )
97(mk-species 'sp_snake           "snake"           2  2 14   100   6   0   6 mmode-walk      t_fangs      nil       1 s_asleep           nil     sound-walking   )
98(mk-species 'sp_bat             "bat"             2  2 14   120   2   0  19 mmode-fastfly   t_fangs      nil       1 s_asleep           nil     nil             )
99(mk-species 'sp_rat             "rat"             4  2 12   100   6   0   6 mmode-crawl     t_F_fangs    nil       1 s_asleep           nil     nil             )
100(mk-species 'sp_spider          "spider"         12  6 14   120   8   2  10 mmode-fastcrawl t_fangs      nil       2 s_asleep           nil     sound-walking   )
101(mk-species 'sp_statue          "statue"          1  1  1   100  99   0   1 mmode-none      nil          nil       0 nil                "16"    nil             )
102(mk-species 'sp_troll           "troll"          14  6 12   100  20   2  10 mmode-walk      t_horns      humanoid  3 s_asleep           nil     sound-walking   )
103(mk-species 'sp_yellow_slime    "yellow slime"    4  4  4   100  12   2   6 mmode-walk      t_acid_spray nil       2 nil                nil     sound-squishing )
104(mk-species 'sp_kraken          "kraken"         30  3 20   100  30   4  19 mmode-fish      t_tentacles  nil      10 s_shoals           "1d4"   sound-splashing )
105(mk-species 'sp_great_kraken    "kraken"         10  5  8   100  30   0  19 mmode-fish      t_G_fangs    nil      10 s_shoals           "1d4"   sound-splashing )
106(mk-species 'sp_kraken_tentacle "kraken"         30  1 20   100  10   2  19 mmode-fish      t_tentacles  nil      10 s_shoals           nil     sound-splashing )
107(mk-species 'sp_sea_serpent     "sea serpent"    20  2 14   100  20   4  19 mmode-fish      t_G_fangs    nil       8 s_asleep           "2d4"   sound-walking   )
108(mk-species 'sp_wolf            "wolf"            8  2 12   100   8   0  13 mmode-fastrun   t_fangs      nil       2 s_asleep           nil     sound-walking   )
109(mk-species 'sp_gazer           "gazer"           6 20  6   100  10   8  16 mmode-hover     t_prismatic_gaze nil   8 s_gazer_asleep     nil     nil             )
110(mk-species 'sp_headless        "headless"       12  0 10   100  14   0   6 mmode-walk      t_hands      humanoid  2 s_asleep           nil     sound-walking   )
111(mk-species 'sp_wisp            "wisp"            2 20 16   140   8   8   9 mmode-hover     nil          nil       4 nil                nil     nil             )
112(mk-species 'sp_dragon          "dragon"         20 10 10   100  50   8   9 mmode-fly       t_G_fangs    nil      20 s_dragon_asleep    "2d4"   sound-walking   )
113(mk-species 'sp_zorn            "zorn"           10 10 10   100  10   2   9 mmode-phase     t_beak       nil       4 s_asleep           nil     sound-walking   )
114(mk-species 'sp_demon           "demon"          14 14 14   100  14   8  12 mmode-fly       t_hands      humanoid  8 s_asleep           nil     sound-walking   )
115(mk-species 'sp_lich            "lich"           12 14 14   100  20  10   9 mmode-walk      t_hands      humanoid  8 s_asleep           nil     sound-walking   )
116(mk-species 'sp_carabid         "carabid"        30  1 10   100   8   0   3 mmode-walk      t_pincers    nil       8 s_carabid_asleep   "4d4+4" sound-walking   )
117(mk-species 'sp_ratling         "ratling"         6  8 14   110   4   2  12 mmode-fastrun   t_F_fangs    humanoid  2 s_asleep           nil     sound-walking   )
118(mk-species 'sp_griffin         "griffin"        20  8 12   120  25   0  19 mmode-fly       t_beak       nil       3 s_griffin_asleep   nil     nil             )
119(mk-species 'sp_griffin_chick   "griffin chick"   5  8 10   100   8   0  19 mmode-fastfly   t_beak       nil       2 s_griffin_chick_asleep nil nil             )
120(mk-species 'sp_deer            "deer"            7  1 14   120   8   0  13 mmode-fastrun   t_horns      nil       1 s_asleep           nil     sound-walking   )
121(mk-species 'sp_chicken         "chicken"         1  1  3   100   1   0  13 mmode-walk      t_beak       nil       1 s_asleep           nil     sound-walking   )
122;;          tag                 name             st in dx   spd bHP bMP  vr mmode           weap         morph    xp sspr               armrdc  mvsnd
123
124;; species that don't move around
125;;                     tag          name         st in dx   spd bHP bMP vr mmode           weap         morph    xp sspr     armrdc
126(mk-stationary-species 'sp_dryad    "dryad"      12 12  4   100  12   6   6 mmode-walk      nil          nil       8 s_forest nil  )
127(mk-stationary-species 'sp_hydra    "hydra"      20  2 10   140  30   8   6 mmode-walk      t_tentacles  nil      10 nil      nil  )
128(mk-stationary-species 'sp_mimic    "mimic"      11  3 10   100  15   0   5 mmode-walk      t_fangs      nil       2 s_chest  "1d2")
129
130;;----------------------------------------------------------------------------
131;; This list of the undead species is used by spells which affect the undead.
132;;----------------------------------------------------------------------------
133(define undead-species-tags
134  (list sp_skeleton sp_lich sp_ghast))
135
136(define (species-is-undead? species)
137  (foldr (lambda (x undead) (or x (eqv? species undead)))
138         #f undead-species-tags))
139
140(define (is-undead? kchar)
141  (species-is-undead? (kern-char-get-species kchar)))
142
143;; ----------------------------------------------------------------------------
144;; Species immunities
145;; ----------------------------------------------------------------------------
146(define (species-is-immune-to-ensnare? species)
147  (or (eqv? species sp_spider)
148      (eqv? species sp_queen_spider)))
149
150(define (species-is-immune-to-paralyze? species)
151  (eqv? species sp_balron)
152  )
153
154;;----------------------------------------------------------------------------
155;; Trigger to generate slimes
156;;----------------------------------------------------------------------------
157(define (slime-gen-target-loc kgen)
158  (let* ((kplace (loc-place (kern-obj-get-location kgen)))
159        (gob (gob-data (kobj-gob kgen)))
160        (x (car gob))
161        (y (cadr gob)))
162    (display "gob:")(display gob)(newline)
163    (mk-loc kplace x y)))
164
165(define (slime-generator-step kgen kstepper)
166  (define (mkslime)
167    (kern-log-msg "A slime emerges from the ooze!")
168    (mk-green-slime))
169  (let* ((kplace (loc-place (kern-obj-get-location kstepper)))
170         (slimes (filter is-green-slime? (kern-place-get-beings kplace))))
171    (if (< (length slimes) 1)
172        (psummon (slime-gen-target-loc kgen)
173                 mkslime
174                 (kern-dice-roll "1d2")))))
175
176(define slime-generator-ifc
177  (ifc '()
178       (method 'step slime-generator-step)))
179
180(mk-obj-type 't_slime_generator nil nil layer-mechanism slime-generator-ifc)
181
182(define (mk-slime-generator x y)
183  (kern-obj-set-visible (bind (kern-mk-obj t_slime_generator 1)
184                              (list x y))
185                        #f))
186
187;;----------------------------------------------------------------------------
188;; On-death closures
189(define (drop kchar . stuff)
190  (map (lambda (ktype) (kern-obj-put-at (kern-mk-obj ktype 1)
191                                        (kern-obj-get-location kchar)))
192       stuff))
193