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