From 81210a050a297b034c6dfcd2f3aad60aa91c1b0b Mon Sep 17 00:00:00 2001 From: Rob Pearce Date: Sun, 9 Nov 2008 05:24:07 +0000 Subject: [PATCH] - Added new monster: fly - Level tweaks - Removed broken moving platform inertia - they now just pause. --- data/levels.dat | 8 +- data/sprites/fly.png | Bin 0 -> 1278 bytes data/sprites/flycaught.png | Bin 0 -> 942 bytes data/sprites/flydead.png | Bin 0 -> 1164 bytes data/sprites/flyjump.png | Bin 0 -> 1221 bytes data/sprites/flywalk2.png | Bin 0 -> 1236 bytes data/world1/level404.dat | 9 +- data/world1/level42.dat | 4 +- defs.h | 13 ++- edit.c | 7 +- rc.c | 233 ++++++++++++++++++++++++++----------- shared.c | 42 ++++++- 12 files changed, 234 insertions(+), 82 deletions(-) create mode 100644 data/sprites/fly.png create mode 100644 data/sprites/flycaught.png create mode 100644 data/sprites/flydead.png create mode 100644 data/sprites/flyjump.png create mode 100644 data/sprites/flywalk2.png diff --git a/data/levels.dat b/data/levels.dat index 18b57da..085a13c 100644 --- a/data/levels.dat +++ b/data/levels.dat @@ -39,10 +39,12 @@ 18,level8.5.dat,Look out above... 40,level40.dat,King Snail 41,level41.dat,Basic Kitchen -42,level42.dat,Precarious Loaves -403,level403.dat,Delayed Release +407,level407.dat,The Fly 404,level404.dat,Off Cuts +42,level42.dat,Precarious Loaves 405,level405.dat,Pitfalls +403,level403.dat,Delayed Release +406,level406.dat,The Kitchen Sink 109,level109.dat,THE END SO FAR 99,level99.dat,TEST LEVEL -406,level406.dat,NEW LEVEL +408,level408.dat,NEW LEVEL diff --git a/data/sprites/fly.png b/data/sprites/fly.png new file mode 100644 index 0000000000000000000000000000000000000000..06ff1d3129349db2a9f2199787d76e89caa1c2e0 GIT binary patch literal 1278 zcmVWFU8GbZ8({Xk{QrNlj4iWF>9@00d%5L_t(I%XO4nY!n3) zhX0wJ`|Q2jZg<-)ZEYK>us~a+1?q)biO~r9U}7Q?HJ}h*ygi7~#Au>1JQ|JRQB6c6 zibe#)C5HROKy8JVrrnm^?cT4mv$Hch7oRAKdR|XXzMTB$e8ip|Pg6aeJ-Xe&!!Rv0 zj0RLqK|?pX8%BL3lU=$t8;#9n(-l<^csEGEF1Qqmqz#T^^((V6Eqdb*3;$EZ2k-30 z)I@?ETzjv|3mi<;LBIq+fwIw%B^l{VxkSQSp3D{_UQrkAG&@+XC{qQcxX|pd&SeUT zNs7^zj5)c~EjX-?FP*&&_&aUO=1pKJj&Qp~KSQ}+(oAxf$UB48LKzAp!Z*4Fg~fS* za=_6d!Y0R1&XmoXBx%i*bslQ$1Sbn&T}$s@P%D>Dp1Nu+14f6#L?F-_?(14PCNQ0^ zTcjhv+MO^B5=OoRo2g)SG3;4Ai0@<5 zsW~&TRaLbc1OPm?btBP#S9pC_NAJ73X5U&=b%JJC_jJ*>Lz%-qquxDf)~SUFqK-IIY(Fvt|n$5@%|gHg@eJsTY_NUrphdv z&#Ev?9VAJ?(CXlL5ppSyaw!R~K%**4m`kRhs}oD*|%xN#xN9<#JnY6UGrt9B+dFbfvD|&wCcBnNK4XxTo)5OlD zT;Yq^>BOe?=GOW1lh-4AcRXcFWivcS@}H$D$&cECfmEYmktRtzq-v^5V7RMB!(w$s z-6wi6{`tX(x%>wYjBJ2utBvvkyG~%ao6*IkBZX`^DAj83JvcnD`_Qp73IMDfS_wfH zUNJ1~z=esaDgXrheu8EQ_`Du66ly{)p&X!H%GZjbpV+v0m2Lxog?Iu3_pFK0gn040 zBPXY2S>+6!++`B@^y;5;>04V$l^R8Wc(QI7akXAgHFO$#923<5uZgY#yRjvNk;}bL2l6MY2vv;InX4wv#X#F-bbMrst o7V2(ZpiFLP;YQv(_|386U*Mn*WE5J4?EnA(07*qoM6N<$g3m)#TL1t6 literal 0 HcmV?d00001 diff --git a/data/sprites/flycaught.png b/data/sprites/flycaught.png new file mode 100644 index 0000000000000000000000000000000000000000..2cb10eaf747181419238a09bb5b1a05f0f397573 GIT binary patch literal 942 zcmV;f15x~mP)z%<00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru*b4~(3k2OdJ)8gl03CEi zSad^gZEa<4bO1wgWnpw>WFU8GbZ8({Xk{QrNlj4iWF>9@00R<9L_t(2&s~#CXk%3X zhW~T!xv#vNr0H#LW16HbS~Epa2CXO*1_T*l9IGNKxDr<`T#2sT2;xR&WkuW!idaMu zaX=Jx;ec4$nYL-MNoMkD(lpPT`^dfbxDZAB*5B^q6YxKte{P+DMBjx2rD|R&Q1J9y_S) zy+r`v^^5Ch@o9P`wQzGIo!6{piJsJN`o9W+MitJd3;;UwP{Jhf%&ZjGMbC#H(BLB= zRL^=Drp3p?hwprXzF#Z&((*?ET@D{k2G}lF@Lls1J=eRooXx!}G|Y2QPA(HI_sSbr zAIJBz{12C-~&1ZBW z7L@$+kzLkO@%L$?SsMy8BHo`!V>P#mo$^7TGw5_rY9~Ug*DSP$-37L`bSaYvCyL2H z3bpnT%I$_hY3Ri~Zv62RJkO(3*C&ih5Jh1^L9a7Veo>NK zjM`N=lmJ8kBLE30fNfl}Y^Omvp^sRjAsW>hKR&CvE<8Bgg)0Cv5%tx%$V`!O&mgw# zfO`CFY>tw$AR-!!!jTx5XOs z%xm_VPf}4J=o_s!-`m<6G@7kjOS;zC-`hP@hh$@bm2(UwjJyzx{sO zwJfvy(v_zb*LQg&88A)Tk?HQi?Uz6M>W6=iQKDo*K_Z-UjK&jU+0)~{0R0+de`X}> QuK)l507*qoM6N<$f=yhfApigX literal 0 HcmV?d00001 diff --git a/data/sprites/flydead.png b/data/sprites/flydead.png new file mode 100644 index 0000000000000000000000000000000000000000..773b2a193b68adbca651c0ce8c635cee8ab73f07 GIT binary patch literal 1164 zcmV;71atd|P)WFU8GbZ8({Xk{QrNlj4iWF>9@00ZzzL_t(I%XL&uXk1kk z{?5Jk{mjgJZ(cH)%(To*rbr~EKQtW*ipip_p@uH(B9uZ!SBi)Tf~%?vx6)-1+~`6V zZd_RCLL;FI!Tv}IXe*J{PTOfFA<65cZ)V=SpL?H+n#4+b;cV_X_kQ=g=X@UxH5wv+ z;J^jjvQDOH%HkwxhhcbI4hBmqj+?>5hl{bPx_1O1$zt!@I^UdD9dkey{ay*l1#E%~R zk#xIF;W)oW8ymkfO!uUNRtHrGDWsh!Jyp+Gfk){g6#F6q6lE@ z0dZdSu3dw0oM8CKkvF}oSKrxgus$+kxrYu-3d{PD8HQq}sfhCwjHLj!gETD#QOa~Z zB_W>d6E(ruBys);&t`i@sdP6}saz<{%z$qJWUJLEXtiR^aTe_H@gHQr52IB20#ZIA z&OZg96Ju@S+(DY^#Q9HVskD&zeuEh65o0fDt}C*&+Qr!O-b&&wGVuGJhxC?!r)`!Nc|S3<>dNyt(nH`a3>vhVGjcqZ?f#@87@&74bkfxnyx_;7ikGq`DPsyOa}2uPo{ zpnkInZD?o-KqbF_|94L%HP_9Prk!S{c}C0UcRlNcqsNZHESKNV3k7>5 eYOebN0Q>{Le4DSzRpPS%0000WFU8GbZ8({Xk{QrNlj4iWF>9@00b#XL_t(I%axSfZxm$| z#?L$N?9A-U&g}PYciX1h!WK4d7l;ToNRR?IBFcr57$U@kM5A69W4!PmFfqg{L-ZOE zF9Z@l&=AxFh1Sv*LKj)v-P(5BZTF+Q+uhF0&e!{TVQNehCH}6?#dGqU^Cah>H_x1A z)2V^a6rXa+awwQOCc2LBh6#YML=h!pK+yPVapuZ{+|5Ef)}_Q^VY0eZEh7$(lxxe= zEN2&;yxO?_aGJsv&}Q+)#}}UUNgW^6YIMg!X&G#W0x!uR$O@Py3+?41OgGjt4ry8< zptNe3Me5}`wN}dvvvdrM!c9RH)3#YUKW{WAe){=71pvUC247zPb~YaJT(m9W8Uut- z8+u%pEk*-A6z}W-r)h$~(MZM6V@$Z4N$%_S9^cc2M)nV~8yX}knc0zZJBJ1qbp3?J z>o9H|GY;P{D;5AOL_df{}E(8u9y; z#ig7abYu9nIs0PPJ!ozpdoqKs44ft41)7Tw}gj?X5 zcvWwoYuP$tcsJMx05dGmwh5+bAna^N7$Y)~%QAu-hPlN&xENSqIXKxSc&X?ShBrhH zDOU=&uYP~$qUd2AEXtfYI+ba2EJj@sZ)mMj<2hodMC9CaBZqHm+66+b-Ht?Z6oLl+$pa#o|6R6<%!?2ndG+aI05o9AR3M+!KKw|C^1G=)%8-Xaw|KR zxBqSBgHP>?s%@k0m*hlat?>fq5^f-DJh*f3uQze%nbZ!!?e2GBp{6#~X#@a}>hI${ z3UA+?c;x(7o~gkI^7}#@(KwzV+-X6APk+2UPPXcvJ~Ze8%E+3k)e-zp&Yn84YbLj{ jC~^Y-!`LsYkJJANze4eln16;)00000NkvXXu0mjfO#M6! literal 0 HcmV?d00001 diff --git a/data/sprites/flywalk2.png b/data/sprites/flywalk2.png new file mode 100644 index 0000000000000000000000000000000000000000..5b24f65e30f784c326f9b4e110fc6f87755569f4 GIT binary patch literal 1236 zcmV;_1S|WAP)WFU8GbZ8({Xk{QrNlj4iWF>9@00cNmL_t(I%Y9T^Oj~sv z{{H9Eb9&m+(sC)64(MQl2qK_d2AiVjVA;bkF)nV4I9zhCnEzWlylz8`tv%qgzA zvRbp+%%Hjfm8!_*6sQ{Ysx;FPj%?gsSX%W*LW!&-nH^vNt7KO=hNq$^XmbmzxuxHK zHt-)H@4kK>zWH^uG(7;bBtl09!B7-_|1wOR138^Rg*y)b@JociY0+Ti1;_~nF=ZQt zHUr_QBKd*>L%XsXYPa;#(h~tD_Syzxf6h14|%=6#zN`@Bq#MSl^NX07ak_ z;CTEWvV~=M=8+?KsJjUO!2Q+l`uxKWCT8bQ`k zW`i70z`pa!Al5=_7@wXT55|^fC7bc7l{mdTB~ofD7D>mpS1O9D+$L=YBCF!Ft0QCO zE@!gKlVQ$ww^+q25{d$^r6DkHvyp66;C>H~^$A}uJ_D5dhQMWnsCv#RPqO)w){ z!t;x>4+GGbA}b`F%i{5-W8cW}VA?71JNnoV}bl|>|i+pvku>N;=nRL3WgE^AQkuJN3m_RXCq zyBF{6Xt!2Xxoc*8OYf!AN-xJ6h^J&iH64nQfvy{184X4Da%?A~$afVWNfjjHG4O;0 zL^E@e80O=pPUB)xL21}x;=jIfZT12IfCoF;ptI?2K{Rz)1kvQMSq?1+1CpVc5^4tS zWKOxflTJUaFuyx2voRji|F>htX#`LuBwB2Tpn^-PTQf%pGMPma1Xbx;^M=jmk z;ACGffx%$%<}AZ8(kMr&5Z7lHy{* zn+V!l>-?1J1<^$0S%CY(Vl_XN%V>c;fv(mTdoa5Bn3next) { drawsprite(s); // waypoint selection mode - if (state == LS_WAYPOINTS) { - if (waypointm == s) { + //if (state == LS_WAYPOINTS) { + //if (waypointm == s) { + if (s->id == P_PLATFORM) { int i; double curx,cury; drawbox16(screen, s->x - s->img->w/2,s->y - s->img->h, @@ -856,7 +857,7 @@ void drawsprites(void) { curx = s->wayx[i]; cury = s->wayy[i]; } } - } + //} } } diff --git a/rc.c b/rc.c index 0c25575..53d1fba 100644 --- a/rc.c +++ b/rc.c @@ -2979,80 +2979,46 @@ int movesprite(sprite_t *s) { if (s->numwaypoints > 0) { sprite_t *s2; double oldx,oldy,xdiff,ydiff; - double slowpoint; - slowpoint = ((double)TILEW*2.5); - //slowpoint = (0.10 * s->dbltimer); // 10% of full distance - - oldx = s->x; - oldy = s->y; - // move torwaeds next waypoints - - - dstx = s->wayx[s->curwaypoint]; - dsty = s->wayy[s->curwaypoint]; - - if (s->dbltimer == -1) { // haven't set full distance yet - s->dbltimer = getdistance(s->x,s->y,dstx,dsty); - if (s->dbltimer > slowpoint*2) { - s->timer1 = 0; // at top speed - } else { - s->timer1 = 1; - } - } - - rv = moveto(s,dstx,dsty,s->speed,s->speed); - - // remember how far we moved - xdiff = s->x - oldx; - ydiff = s->y - oldy; - - // got there? - if (rv == 0) { - // go to next waypoint - s->curwaypoint++; - if (s->curwaypoint >= s->numwaypoints) { - s->curwaypoint = 0; - } - // recalc total distance + if (s->timer1 == 0) { + oldx = s->x; + oldy = s->y; + // move torwaeds next waypoints dstx = s->wayx[s->curwaypoint]; dsty = s->wayy[s->curwaypoint]; - s->dbltimer = getdistance(s->x,s->y,dstx,dsty); + + + rv = moveto(s,dstx,dsty,s->speed,s->speed); + + // remember how far we moved + xdiff = s->x - oldx; + ydiff = s->y - oldy; + + // got there? + if (rv == 0) { + // pause + s->timer1 = PLATFORMPAUSE; + } + + // move anything on top of us by the same amount + for (s2 = sprite ; s2 ; s2 = s2->next) { + if (s2->onplatform == s) { + s2->x += xdiff; + s2->y += ydiff; + } + } } else { - // adjust speed - if (timer % PLATFORMDELAY == 0) { - double maxspeed = getspeed(s); - - if ((rv <= slowpoint) && (s->timer1 <= 0)) { // getting close... - // slow down - s->timer1 = -1; - if (s->speed > PLATFORM_MINSPEED) { - s->speed -= PLATFORM_ACCEL; - if (s->speed < PLATFORM_MINSPEED) s->speed = PLATFORM_MINSPEED; - } - } else if (s->speed < maxspeed) { - // speed up - s->timer1 = 1; // speeding up - s->speed += PLATFORM_ACCEL; - if (s->speed > maxspeed) s->speed = maxspeed; - } - // reached top speed? - if (s->speed >= maxspeed) { - if (rv > slowpoint*2) { - s->timer1 = 0; // at top speed - } + s->timer1--; + if (s->timer1 == 0) { + // go to next waypoint + s->curwaypoint++; + if (s->curwaypoint >= s->numwaypoints) { + s->curwaypoint = 0; } } } - // move anything on top of us by the same amount - for (s2 = sprite ; s2 ; s2 = s2->next) { - if (s2->onplatform == s) { - s2->x += xdiff; - s2->y += ydiff; - } - } } } else if (s->id == P_TICK) { @@ -3275,6 +3241,140 @@ int movesprite(sprite_t *s) { s->y += s->ys; s->dir = absxs; s->moved = MV_WALK; + } else if (s->id == P_FLY) { // fly - like bee but more erratic flight and can walk on ground if player far away + double absxs,absys; + double xmod,ymod; + if (s->flies) { + if ((s->xs == -99) || (s->ys == -99)) { + s->xs = getspeed(s); + s->ys = -getspeed(s); + } + + if (s->xs > 0) absxs = 1; + else absxs = -1; + + if (s->ys > 0) absys = 1; + else absys = -1; + + /* this will fix the speed if ANGRY is set */ + s->xs = absxs*getspeed(s); + s->ys = absys*getspeed(s); + + if (s->flies == F_FLYVERT) { + ymod = sin(((double)timer * (double)3.6) * (M_PI/180)); + //ymod *= 0.8; + if (s->ys * (ymod) > 0) absys = 1; + else absys = -1; + } else if (s->flies == F_FLYHORZ) { + xmod = sin(((double)timer * (double)3.6) * (M_PI/180)); + if (s->xs * (xmod) > 0) absxs = 1; + else absxs = -1; + } + + + + /* can we move? */ + tt = gettileat(s->x + absxs*((s->img->w/2)+8), s->y-(s->img->h/2),NULL,NULL); + if ((tt->solid) || (tt->spikes )) { + /* turn */ + s->xs = -s->xs; + } + + tt = gettileat(s->x, s->y-(s->img->h/2) + absys*((s->img->h/2)+8),NULL,NULL); + if ((tt->solid) || (tt->spikes) || (tt->water)) { + /* turn */ + s->ys = -s->ys; + } + + /* move */ + if (s->flies == F_FLYVERT) { + s->x += s->xs; + s->y += (s->ys * ymod); + } else { + s->x += (s->xs * xmod); + s->y += s->ys; + } + + s->dir = absxs; + s->moved = MV_FLY; + + // inc flying timer + s->timer1++; + if (s->timer1 >= FLY_FLYTIME) { + if (s->flies == F_FLYHORZ) { + s->flies = F_FLYVERT; + } else { + s->flies = F_WALK; + } + s->timer1 = 0; + } + } else { // walking - move like a rat + double myspeed = getspeed(s) * 0.75; + double playerdist; + if (!s->falling) { + int move = B_FALSE; + int xdiff, absxdiff; + tiletype_t *tunder; + + /* distance to player */ + xdiff = player->x - s->x; + if (xdiff < 0) absxdiff = -xdiff; + else absxdiff = xdiff; + + // tile in front and below + tt = gettileat(s->x + s->dir*myspeed + (s->dir * (s->img->w/2)),s->y + (TILEH/2),NULL,NULL); + // tile below + tunder = gettileat(s->x ,s->y + 1,NULL,NULL); + /* if there's a hole in front of us and below*/ + if (tt->solid == S_NOTSOLID) { + // we're on a slope + if (tunder->solid == S_SLOPE) { + move = B_TRUE; + } + } else { + move = B_TRUE; + } + + /* either move or turn around */ + if (move) { + rv = movex(s, s->dir*myspeed); + if (rv) { + /* if we couldn't move (hit a wall), turn */ + s->dir = -s->dir; + } + } else { + s->dir = -s->dir; + } + s->moved = MV_WALK; + + // take off if player is close + playerdist = getdistance(player->x,player->y,s->x,s->y); + if (playerdist <= (TILEW*10)) { + s->timer1 = 0; + s->flies = F_FLYHORZ; + s->xs = -99; + s->ys = -99; + } + + // ...and take off eventually anyway + s->timer1++; + if (s->timer1 >= FLY_WALKTIME) { + s->timer1 = 0; + s->flies = F_FLYHORZ; + s->xs = -99; + s->ys = -99; + } + } else { // falling + tiletype_t *tunder, *t2under; + + // tile below + tunder = gettileat(s->x ,s->y,NULL,NULL); + t2under = gettileat(s->x ,s->y+s->img->h,NULL,NULL); + if ((tunder->solid == S_SLOPE) || (t2under->solid == S_SLOPE)) { + movex(s, s->dir*myspeed); + } + } + } } else if (s->id == P_FISH) { // very similar to bee double absxs,absys; if ((s->xs == -99) || (s->ys == -99)) { @@ -4181,6 +4281,9 @@ double getspeed(sprite_t *s ) { } else if (id == P_BEE) { if (s->angry) speed = 2; else speed = 1; + } else if (id == P_FLY) { + if (s->angry) speed = 2.5; + else speed = 1.5; } else if (id == P_SPIDER) { if (s->angry) speed = 2; else speed = 1.5; diff --git a/shared.c b/shared.c index 4f50d14..5c0e181 100644 --- a/shared.c +++ b/shared.c @@ -259,7 +259,14 @@ int loadlevel(int wnum, int lnum, int wantmonsters) { // waypoints if (isplatform(monid)) { - level->initm[level->nummonsters].numwaypoints = 0; + + // initial waypoint is start position + level->initm[level->nummonsters].wayx[0] = x*TILEW+(TILEW/2); + level->initm[level->nummonsters].wayy[0] = y*TILEH+(TILEH-2)+2; + level->initm[level->nummonsters].numwaypoints = 1; + + + // read waypoints p = strtok(NULL, " "); while (p) { @@ -725,6 +732,9 @@ void setdefaults(sprite_t *s) { case P_SPIDER: s->flies = B_TRUE; break; + case P_FLY: + s->flies = F_FLYVERT; + break; default: s->flies = B_FALSE; break; @@ -1156,6 +1166,14 @@ int loadimagesets(void) { /* next 3 are auto generated */ imageset[P_BEE].numimages = 8; + loadspriteimage(P_FLY,F_WALK1, "sprites/fly.png"); + loadspriteimage(P_FLY,F_JUMP, "sprites/flywalk2.png"); + loadspriteimage(P_FLY,F_FALL, "sprites/flyjump.png"); + loadspriteimage(P_FLY,F_CAUGHT, "sprites/flycaught.png"); + loadspriteimage(P_FLY,F_DEAD, "sprites/flydead.png"); + /* next 3 are auto generated */ + imageset[P_FLY].numimages = 8; + loadspriteimage(P_SPIDER,F_WALK1, "sprites/newspider.png"); loadspriteimage(P_SPIDER,F_JUMP, "sprites/newspiderjump.png"); loadspriteimage(P_SPIDER,F_FALL, "sprites/newspiderfall.png"); @@ -1810,13 +1828,32 @@ void drawsprite(sprite_t *s) { if ((s->id == P_SPIDER) && (s->ys != -99)) { frame = F_FALL; } else { + // DEFAULT FOR EVERYTHING // walking / sliding if (s->moved == MV_WALK) { + // toggle between walking frames if ((timer/12) % 2 == 0) { frame = F_WALK1; } else { frame = F_JUMP; } + } else if (s->moved == MV_FLY) { + int animspeed; + // fly animates faster + if ((s->id == P_FLY) && (s->flies)) { + animspeed = 3; + } else { + animspeed = 12; + } + + + // toggle between flying frames + if ((timer/animspeed) % 2 == 0) { + frame = F_WALK1; + } else { + frame = F_FALL; + } + } else if (s->moved == MV_ICE) { frame = F_FALL; } else { @@ -1857,6 +1894,7 @@ void drawsprite(sprite_t *s) { // image based on timer1 s->img = imageset[s->timer1].img[F_WALK1]; } else if ((s->id != P_BLACKCLOUD) && (s->id != P_PINKCLOUD) && (!s->teleporting)) { + // ALL OTHERS: // select image based on sprite id s->img = imageset[s->id].img[frame]; } @@ -2613,6 +2651,7 @@ int ismonster(int id) { switch (id) { case P_RAT: case P_BEE: + case P_FLY: case P_SPIDER: case P_SNAKE: case P_TICK: @@ -3050,6 +3089,7 @@ void setfruitinfo(void) { setinfo(P_SPIDER, "Spider", "Spiders will lurk quietly on the ceiling, crawling back and forth. If they notice a player nearby however they will swiftly pounce down onto their prey!", "spider.png"); setinfo(P_SNAKE, "Snake", "The snake moves in a similar fashion to the rat with one important exception - upon seeing a player they will spit a glob of deadly venom at them!", "snake.png"); + setinfo(P_FLY, "Fly", "Annoying pests at the best of times, flies pose additional danger to dwarves. They fly around more erratically than bees and after landing can scurry quickly back and forth.", "fly.png"); setinfo(P_TICK, "Tick", "The tick is small but intelligent - even in its regular placid state it will move in the same manner as an angry rat. Because of their small size, they are also difficult to arget with a slam!", "tick.png");