void freakdoor(int in,int cn) { int me,you,in2; if (!cn) return; // avoid endless recursion if (it[in].drdata[9]) return; me=it[in].drdata[8]; if (it[in].drdata[14]) me=0; // one-way freaks if (me) { you=*(unsigned int*)(it[in].drdata+10); if (!you) { for (in2=1; in2<MAXITEM; in2++) { if (!it[in2].flags) continue; if (it[in2].driver!=IDR_FREAKDOOR) continue; if (in2==in) continue; if (it[in2].drdata[15]) continue; // no-target freak if (it[in2].drdata[8]==me) break; } if (in2==MAXITEM) { elog("PANIC: freakdoor %d at %d,%d: partner not found",me,it[in].x,it[in].y); return; } you=*(unsigned int*)(it[in].drdata+10)=in2; } } else you=in; //log_char(cn,LOG_SYSTEM,0,"Door %d (%d/%d)",me,in,you); if (it[in].x!=ch[cn].x || it[in].y!=ch[cn].y) { item_driver(IDR_DOOR,in,cn); // open the other door if it is closed and our door was opened if (you!=in && it[in].drdata[0] && !it[you].drdata[0]) item_driver(IDR_DOOR,you,cn); } else if (in!=you) { int dx,dy,px,py; // open the other door if it is still closed if (!it[you].drdata[0]) item_driver(IDR_DOOR,you,cn); if (player_driver_get_move(cn,&px,&py)) { dx=px-ch[cn].x; dy=py-ch[cn].y; } else dx=dy=0; it[you].drdata[9]=1; // set flag: no 2nd jump teleport_char_driver(cn,it[you].x,it[you].y); it[you].drdata[9]=0; if (dx || dy) { player_driver_fake_move(cn,ch[cn].x+dx,ch[cn].y+dy); } } }
void backtofire(int in,int cn) { if (!cn) return; if (!it[in].carried) return; // can only use if item is carried if (teleport_char_driver(cn,it[in].drdata[0],it[in].drdata[1])) { if (ch[cn].flags&CF_PLAYER) dlog(cn,in,"dropped because it was used"); remove_item_char(in); destroy_item(in); log_char(cn,LOG_SYSTEM,0,"The scroll vanished."); } }
void keyholder_door(int in,int cn) { int x,y,n,in2,flag,co,nr; char buf[80]; if (!cn) return; nr=it[in].drdata[0]; for (n=0; n<9; n++) { flag=0; for (x=2+(n%3)*8; x<9+(n%3)*8; x++) { for (y=231+(n/3)*8; y<238+(n/3)*8; y++) { if ((in2=map[x+y*MAXMAP].it) && (it[in2].flags&IF_TAKE)) { flag=1; break; } if (map[x+y*MAXMAP].ch) { flag=1; break; } } } if (!flag) break; } if (flag) { log_char(cn,LOG_SYSTEM,0,"You hear fighting noises from behind the door. It won't open while the fight lasts."); return; } if (!(in2=ch[cn].citem) || it[in2].driver!=IDR_ENHANCE || it[in2].drdata[0]!=2 || *(unsigned int*)(it[in2].drdata+1)!=2000) { log_char(cn,LOG_SYSTEM,0,"You'll need to use 2000 gold units as a key to open the door."); return; } if (!teleport_char_driver(cn,2+(n%3)*8+1,231+(n/3)*8+3)) { log_char(cn,LOG_SYSTEM,0,"You hear fighting noises from behind the door. It won't open while the fight lasts."); return; } destroy_item(in2); ch[cn].citem=0; ch[cn].flags|=CF_ITEMS; sprintf(buf,"keyholder_golem%d",nr); co=create_char(buf,0); if (co) { update_char(co); ch[co].hp=ch[co].value[0][V_HP]*POWERSCALE; ch[co].endurance=ch[co].value[0][V_ENDURANCE]*POWERSCALE; ch[co].mana=ch[co].value[0][V_MANA]*POWERSCALE; ch[co].dir=DX_LEFTUP; ch[co].tmpx=2+(n%3)*8+5; ch[co].tmpy=231+(n/3)*8+3; drop_char(co,2+(n%3)*8+5,231+(n/3)*8+3,1); } }
void warpteleport_driver(int in,int cn) { int in2,target,n,flag=0; if (!cn) return; if (!it[in].drdata[0]) { switch(it[in].drdata[1]) { case 1: flag=teleport_char_driver(cn,242,252); break; case 2: flag=teleport_char_driver(cn,247,66); break; case 3: flag=teleport_char_driver(cn,251,16); break; case 4: flag=teleport_char_driver(cn,152,7); break; case 5: flag=teleport_char_driver(cn,183,250); break; default: log_char(cn,LOG_SYSTEM,0,"You found BUG #31as5."); } if (!flag) log_char(cn,LOG_SYSTEM,0,"Target is busy, please try again soon."); return; } if (!(in2=ch[cn].citem) || it[in2].ID!=IID_AREA25_TELEKEY) { log_char(cn,LOG_SYSTEM,0,"Nothing happened."); return; } target=(it[in].drdata[0]-1)*5+(it[in2].drdata[0]-1); //log_char(cn,LOG_SYSTEM,0,"target=%d",target); if (teleport_char_driver(cn,tl[target].x,tl[target].y)) { ch[cn].citem=0; ch[cn].flags|=CF_ITEMS; destroy_item(in2); flag++; for (n=0; n<INVENTORYSIZE; n++) { if ((in2=ch[cn].item[n]) && it[in2].ID==IID_AREA25_TELEKEY) { remove_item_char(in2); destroy_item(in2); flag++; } } if (flag) log_char(cn,LOG_SYSTEM,0,"Your sphere%s vanished.",flag>0 ? "s" : ""); } }
int warpkeydoor_driver(int in,int cn) { int in2,dx,dy; if (!cn) return 1; dx=it[in].x-ch[cn].x; dy=it[in].y-ch[cn].y; if (!dx && !dy) { log_char(cn,LOG_SYSTEM,0,"Bug #329i, sorry."); return 2; } in2=has_item(cn,IID_AREA25_DOORKEY); if (!in2) { log_char(cn,LOG_SYSTEM,0,"The door is locked and you do not have the right key."); return 2; } if (teleport_char_driver(cn,it[in].x+dx,it[in].y+dy)) { log_char(cn,LOG_SYSTEM,0,"A %s vanished.",it[in2].name); remove_item_char(in2); destroy_item(in2); switch(ch[cn].dir) { case DX_RIGHT: ch[cn].dir=DX_LEFT; break; case DX_LEFT: ch[cn].dir=DX_RIGHT; break; case DX_UP: ch[cn].dir=DX_DOWN; break; case DX_DOWN: ch[cn].dir=DX_UP; break; } return 1; } else { log_char(cn,LOG_SYSTEM,0,"Oops. Please try again."); return 2; } }
void warpfighter_died(int cn,int co) { struct warpfighter_data *dat; dat=set_data(cn,DRD_WARPFIGHTER,sizeof(struct warpfighter_data)); if (!dat) return; // oops... if (dat->co!=co) { xlog("1"); return; } if (!ch[co].flags || ch[co].serial!=dat->cser || ch[co].x<dat->xs || ch[co].y<dat->ys || ch[co].x>dat->xe || ch[co].y>dat->ye) { xlog("2"); return; } teleport_char_driver(co,dat->tx,dat->ty); //xlog("3 %d %d",dat->tx,dat->ty); }
void edemontube_driver(int in,int cn) { int nr,in2,x,y,n,co,next,light,sprite; nr=it[in].drdata[0]; if (cn) { // character using it teleport_char_driver(cn,*(unsigned short*)(it[in].drdata+2),*(unsigned short*)(it[in].drdata+4)); } else { // timer call if (sect[nr] && sect[nr]<249) { light=200; sprite=14138; } else { light=0; sprite=14137; } if (it[in].sprite!=sprite) { it[in].sprite=sprite; set_sector(it[in].x,it[in].y); } if (it[in].mod_value[0]!=light) { remove_item_light(in); it[in].mod_value[0]=light; add_item_light(in); } if (!(*(unsigned short*)(it[in].drdata+2))) { for (in2=1; in2<MAXITEM; in2++) { if (it[in2].driver==IDR_EDEMONLOADER && it[in2].drdata[0]==nr) { // find teleport target (up or down of item) x=it[in2].x; y=it[in2].y; if (!(map[x+y*MAXMAP+MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK))) y++; else if (!(map[x+y*MAXMAP-MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK))) y--; // remember target *(unsigned short*)(it[in].drdata+2)=x; *(unsigned short*)(it[in].drdata+4)=y; //xlog("%s (%d) found %s (%d) at %d,%d",it[in].name,in,it[in2].name,in2,it[in2].x,it[in2].y); } } } if (sect[nr]>250) { for (n=0; n<25; n++) { for (co=getfirst_char_sector(it[in].x+offx[n],it[in].y+offy[n]); co; co=next) { next=ch[co].sec_next; if (!(ch[co].flags&CF_PLAYER)) continue; if (abs(ch[co].x-it[in].x)>10 || abs(ch[co].y-it[in].y)>10) continue; if (char_see_item(co,in)) { teleport_char_driver(co,*(unsigned short*)(it[in].drdata+2),*(unsigned short*)(it[in].drdata+4)); log_char(co,LOG_SYSTEM,0,"The strange tube teleported you."); } } } } call_item(it[in].driver,in,0,ticker+TICKS); } }
void minedoor(int in,int cn) { int in2,nr,ret; // gather information about door system if (!door_init) { for (in2=1; in2<MAXITEM; in2++) { if (!it[in2].flags) continue; if (it[in2].driver!=IDR_MINEDOOR) continue; nr=it[in2].drdata[0]; //xlog("found something at %d,%d",it[in2].x,it[in2].y); if (!it[in2].drdata[1]) { // source door if (it[in2].drdata[3]) { // usable source door if (sdoor[nr]) xlog("confused: two source doors"); sdoor[nr]=in2; //xlog("source %d is at %d,%d",it[in2].drdata[0],it[in2].x,it[in2].y); } } else { // target door if (tdoor[nr]) xlog("confused: two target doors"); tdoor[nr]=in2; //xlog("target %d is at %d,%d",it[in2].drdata[0],it[in2].x,it[in2].y); } } door_init=1; } nr=it[in].drdata[0]; if (!cn) { // timer call call_item(it[in].driver,in,0,ticker+TICKS*30); if (it[in].drdata[3]) return; // we're already open, dont do anything // dont change it when the surrounding walls have been dug away if (!(map[it[in].x+it[in].y*MAXMAP+1].flags&(MF_SIGHTBLOCK|MF_TSIGHTBLOCK)) || !(map[it[in].x+it[in].y*MAXMAP-1].flags&(MF_SIGHTBLOCK|MF_TSIGHTBLOCK)) || !(map[it[in].x+it[in].y*MAXMAP+MAXMAP].flags&(MF_SIGHTBLOCK|MF_TSIGHTBLOCK)) || !(map[it[in].x+it[in].y*MAXMAP-MAXMAP].flags&(MF_SIGHTBLOCK|MF_TSIGHTBLOCK)) || !(map[it[in].x+it[in].y*MAXMAP+1+MAXMAP].flags&(MF_SIGHTBLOCK|MF_TSIGHTBLOCK)) || !(map[it[in].x+it[in].y*MAXMAP+1-MAXMAP].flags&(MF_SIGHTBLOCK|MF_TSIGHTBLOCK)) || !(map[it[in].x+it[in].y*MAXMAP-1+MAXMAP].flags&(MF_SIGHTBLOCK|MF_TSIGHTBLOCK)) || !(map[it[in].x+it[in].y*MAXMAP-1-MAXMAP].flags&(MF_SIGHTBLOCK|MF_TSIGHTBLOCK))) { //xlog("dug out 1"); return; } if ((in2=sdoor[nr])) { // there is a source door already, close it if (!(map[it[in2].x+it[in2].y*MAXMAP+1].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) || !(map[it[in2].x+it[in2].y*MAXMAP-1].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) || !(map[it[in2].x+it[in2].y*MAXMAP+MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) || !(map[it[in2].x+it[in2].y*MAXMAP-MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) || !(map[it[in2].x+it[in2].y*MAXMAP+1+MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) || !(map[it[in2].x+it[in2].y*MAXMAP+1-MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) || !(map[it[in2].x+it[in2].y*MAXMAP-1+MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) || !(map[it[in2].x+it[in2].y*MAXMAP-1-MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK))) { //xlog("dug out 2"); return; } if (RANDOM(20)) return; // some randomness it[in2].sprite=15000; it[in2].flags&=~IF_USE; it[in2].drdata[3]=0; set_sector(it[in2].x,it[in2].y); //xlog("closed source door %d at %d,%d",nr,it[in2].x,it[in2].y); } switch(it[in].drdata[2]) { case DX_UP: case DX_DOWN: it[in].sprite=20124; break; case DX_RIGHT: case DX_LEFT: it[in].sprite=20122; break; } it[in].flags|=IF_USE; it[in].drdata[3]=1; set_sector(it[in].x,it[in].y); sdoor[nr]=in; //xlog("opened source door %d at %d,%d",nr,it[in].x,it[in].y); return; } // find target if (it[in].drdata[1]) in2=sdoor[nr]; else in2=tdoor[nr]; // teleport character to target ret=0; switch(it[in2].drdata[2]) { case DX_UP: ret=teleport_char_driver(cn,it[in2].x,it[in2].y-1); break; case DX_DOWN: ret=teleport_char_driver(cn,it[in2].x,it[in2].y+1); break; case DX_RIGHT: ret=teleport_char_driver(cn,it[in2].x-1,it[in2].y); break; case DX_LEFT: ret=teleport_char_driver(cn,it[in2].x+1,it[in2].y); break; } if (!ret) { log_char(cn,LOG_SYSTEM,0,"The mine has collapsed behind this door. Some friendly spirit grabs you and teleports you somewhere else."); if (areaID!=31) teleport_char_driver(cn,230,240); else teleport_char_driver(cn,211,231); } }
int warptrialdoor_driver(int in,int cn) { int xs,ys,xe,ye,x,y,m,in2,dx,dy,dir,co; struct warpfighter_data *dat; struct warped_ppd *ppd; ppd=set_data(cn,DRD_WARP_PPD,sizeof(struct warped_ppd)); if (!ppd) return 2; // oops... if (!ppd->base) ppd->base=40; if (!it[in].drdata[2]) { xs=xe=ys=ye=in2=0; for (x=it[in].x+1,y=it[in].y; x<it[in].x+15; x++) { if (map[x+y*MAXMAP].it && it[map[x+y*MAXMAP].it].driver==IDR_WARPTRIALDOOR) { in2=map[x+y*MAXMAP].it; xs=it[in].x; xe=it[in2].x; for (x=it[in].x+1,y=it[in].y; y<it[in].y+15; y++) { if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) { ye=y; break; } } for (x=it[in].x+1,y=it[in].y; y>it[in].y-15; y--) { if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) { ys=y; break; } } break; } if (map[x+y*MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) break; } if (!in2) { for (x=it[in].x-1,y=it[in].y; x>it[in].x-15; x--) { if (map[x+y*MAXMAP].it && it[map[x+y*MAXMAP].it].driver==IDR_WARPTRIALDOOR) { in2=map[x+y*MAXMAP].it; xe=it[in].x; xs=it[in2].x; for (x=it[in].x-1,y=it[in].y; y<it[in].y+15; y++) { if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) { ye=y; break; } } for (x=it[in].x-1,y=it[in].y; y>it[in].y-15; y--) { if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) { ys=y; break; } } break; } if (map[x+y*MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) break; } } if (!in2) { for (x=it[in].x,y=it[in].y+1; y<it[in].y+15; y++) { if (map[x+y*MAXMAP].it && it[map[x+y*MAXMAP].it].driver==IDR_WARPTRIALDOOR) { in2=map[x+y*MAXMAP].it; ys=it[in].y; ye=it[in2].y; for (x=it[in].x,y=it[in].y+1; x<it[in].x+15; x++) { if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) { xe=x; break; } } for (x=it[in].x,y=it[in].y+1; x>it[in].x-15; x--) { if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) { xs=x; break; } } break; } if (map[x+y*MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) break; } } if (!in2) { for (x=it[in].x,y=it[in].y-1; y>it[in].y-15; y--) { if (map[x+y*MAXMAP].it && it[map[x+y*MAXMAP].it].driver==IDR_WARPTRIALDOOR) { in2=map[x+y*MAXMAP].it; ye=it[in].y; ys=it[in2].y; for (x=it[in].x,y=it[in].y-1; x<it[in].x+15; x++) { if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) { xe=x; break; } } for (x=it[in].x,y=it[in].y-1; x>it[in].x-15; x--) { if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) { xs=x; break; } } break; } if (map[x+y*MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) break; } } //xlog("xs=%d, ys=%d, xe=%d, ye=%d, in=%d, in2=%d",xs,ys,xe,ye,in,in2); it[in].drdata[2]=xs; it[in].drdata[3]=ys; it[in].drdata[4]=xe; it[in].drdata[5]=ye; *(unsigned short*)(it[in].drdata+6)=in2; } if (!cn) return 2; xs=it[in].drdata[2]; ys=it[in].drdata[3]; xe=it[in].drdata[4]; ye=it[in].drdata[5]; in2=*(unsigned short*)(it[in].drdata+6); if (ch[cn].x>=xs && ch[cn].x<=xe && ch[cn].y>=ys && ch[cn].y<=ye) { log_char(cn,LOG_SYSTEM,0,"You cannot open the door from this side."); return 2; } for (y=ys+1; y<ye; y++) { for (x=xs+1,m=x+y*MAXMAP; x<xe; x++,m++) { if ((co=map[m].ch) && ch[co].driver!=CDR_SIMPLEBADDY) { log_char(cn,LOG_SYSTEM,0,"You hear fighting noises and the door won't open."); return 2; } } } co=create_char("warped_fighter",0); if (!co) { log_char(cn,LOG_SYSTEM,0,"Bug #319i, sorry."); return 2; } if (!drop_char(co,(xs+xe)/2,(ys+ye)/2,0)) { log_char(cn,LOG_SYSTEM,0,"Bug #319j, sorry."); destroy_char(co); return 2; } ch[co].tmpx=ch[co].x; ch[co].tmpy=ch[co].y; warped_raise(co,ppd->base); update_char(co); ch[co].hp=ch[co].value[0][V_HP]*POWERSCALE; ch[co].endurance=ch[co].value[0][V_ENDURANCE]*POWERSCALE; ch[co].mana=ch[co].value[0][V_MANA]*POWERSCALE; ch[co].lifeshield=ch[co].value[0][V_MAGICSHIELD]*POWERSCALE; ch[co].dir=DX_RIGHTDOWN; dat=set_data(co,DRD_WARPFIGHTER,sizeof(struct warpfighter_data)); if (!dat) { log_char(cn,LOG_SYSTEM,0,"Bug #319k, sorry."); remove_char(co); destroy_char(co); return 2; } dir=offset2dx(it[in].x,it[in].y,it[in2].x,it[in2].y); if (!dir) { log_char(cn,LOG_SYSTEM,0,"Bug #319l, sorry."); remove_char(co); destroy_char(co); return 2; } dx2offset(dir,&dx,&dy,NULL); dat->co=cn; dat->cser=ch[cn].serial; dat->tx=it[in2].x+dx; dat->ty=it[in2].y+dy; dat->xs=xs; dat->xe=xe; dat->ys=ys; dat->ye=ye; teleport_char_driver(cn,it[in].x+dx,it[in].y+dy); return 1; }
void lab5_item(int in, int cn) { struct lab5_player_data *pd; char *drdata,dx,dy; int in2; drdata=it[in].drdata; if (!numchestboxes) count_chestboxes(); if (!cn) { // fireface if (drdata[0]==2) { if (it[in].sprite==11135) { dx=1; dy=0; } else if (it[in].sprite==11136) { dx=0; dy=-1; } else if (it[in].sprite==11137) { dx=-1; dy=0; } else /*if (it[in].sprite==11138)*/ { dx=0; dy=1; } create_fireball(0,it[in].x+dx,it[in].y+dy,it[in].x+dx+dx,it[in].y+dy+dy,50); if (drdata[1]==0) { drdata[1]=1; call_item(it[in].driver,in,0,ticker+(((it[in].x+it[in].y)%17)+1)*TICKS); } else call_item(it[in].driver,in,0,ticker+5*TICKS); } // lightface if (drdata[0]==13) { if (it[in].sprite==11135) { dx=1; dy=0; } else if (it[in].sprite==11136) { dx=0; dy=-1; } else if (it[in].sprite==11137) { dx=-1; dy=0; } else /*if (it[in].sprite==11138)*/ { dx=0; dy=1; } create_ball(0,it[in].x+dx,it[in].y+dy,it[in].x+dx+dx,it[in].y+dy+dy,40); if (drdata[1]==0) { drdata[1]=1; call_item(it[in].driver,in,0,ticker+(((it[in].x+it[in].y)%10)+1)*TICKS); } else if (drdata[2]==4) { call_item(it[in].driver,in,0,ticker+9*TICKS); drdata[2]=0; } else { call_item(it[in].driver,in,0,ticker+7*TICKS/4); drdata[2]++; } } // chestbox if (drdata[0]==3) { if (!drdata[3]) return; drdata[3]=0; it[in].sprite--; set_sector(it[in].x,it[in].y); } // nameplate if (drdata[0]==5) { namecoordx[(int)drdata[1]]=it[in].x; namecoordy[(int)drdata[1]]=it[in].y; } // entrance if (drdata[0]==7) { it[in].sprite=0; set_sector(it[in].x,it[in].y); } // backdoor if (drdata[0]==8) { static int bcnt=0; daemondoorx[bcnt]=it[in].x; daemondoory[bcnt]=it[in].y; bcnt++; } // gun if (drdata[0]==9) { if (!drdata[1]) return; drdata[1]--; it[in].sprite--; set_sector(it[in].x,it[in].y); if (drdata[1]) call_item(it[in].driver,in,0,ticker+GUNRELOAD); } // pike if (drdata[0]==10) { if (!drdata[1]) return; drdata[1]=0; it[in].sprite--; set_sector(it[in].x,it[in].y); } } else { // obelisk if (drdata[0]==1) { ch[cn].hp=ch[cn].value[0][V_HP]*POWERSCALE; ch[cn].mana=ch[cn].value[0][V_MANA]*POWERSCALE; ch[cn].endurance=ch[cn].value[0][V_ENDURANCE]*POWERSCALE; ch[cn].lifeshield=get_lifeshield_max(cn)*POWERSCALE; sound_area(ch[cn].x,ch[cn].y,41); } // chestbox if (drdata[0]==3) { char *str; if (drdata[3]) return; if (ch[cn].citem) return; // check if it was already opened if (check_chestbox(cn,in)) { log_char(cn,LOG_SYSTEM,0,"Thou canst not open the chest again."); return; } // open box (and call close timer) drdata[3]=1; it[in].sprite++; set_sector(it[in].x,it[in].y); call_item(it[in].driver,in,0,ticker+2*TICKS); // which item switch(drdata[1]) { case 1: str="lab5_combopotion"; break; case 2: str="lab5_staff"; break; case 3: str="lab5_dagger"; break; case 4: str="lab5_sword"; break; case 5: str="lab5_twohanded"; break; case 6: str="lab5_manapotion"; break; case 7: str="lab5_manslayer"; break; default: str="oops"; break; } // create and give potion to player in2=create_item(str); log_char(cn,LOG_SYSTEM,0,"You received a %s.",it[in2].name); if (!in2) { xlog("failed to create '%s' item in %s %d",str,__FILE__,__LINE__); return; } ch[cn].citem=in2; ch[cn].flags|=CF_ITEMS; it[in2].carried=cn; } // combopotion if (drdata[0]==4) { ch[cn].hp=ch[cn].value[0][V_HP]*POWERSCALE; ch[cn].mana=ch[cn].value[0][V_MANA]*POWERSCALE; ch[cn].endurance=ch[cn].value[0][V_ENDURANCE]*POWERSCALE; if (ch[cn].value[1][V_MAGICSHIELD]) ch[cn].lifeshield=get_lifeshield_max(cn)*POWERSCALE; log_area(ch[cn].x,ch[cn].y,LOG_INFO,cn,10,"%s drinks a potion.",ch[cn].name); remove_item(in); free_item(in); } // manapotion if (drdata[0]==12) { // ch[cn].hp=ch[cn].value[0][V_HP]*POWERSCALE; ch[cn].mana=ch[cn].value[0][V_MANA]*POWERSCALE; // ch[cn].endurance=ch[cn].value[0][V_ENDURANCE]*POWERSCALE; if (ch[cn].value[1][V_MAGICSHIELD]) ch[cn].lifeshield=get_lifeshield_max(cn)*POWERSCALE; log_area(ch[cn].x,ch[cn].y,LOG_INFO,cn,10,"%s drinks a potion.",ch[cn].name); remove_item(in); free_item(in); } // nameplate if (drdata[0]==5) { // get pd pd=set_data(cn,DRD_LAB5_PLAYER,sizeof(struct lab5_player_data)); if (!pd) return; if (pd->ritualstate==0) { sound_area(ch[cn].x,ch[cn].y,41); pd->ritualdaemon=drdata[1]; pd->ritualstate=1; log_char(cn,LOG_SYSTEM,0,"Thou canst read the symbols now. They form the words:"); log_char(cn,LOG_SYSTEM,0,"°c3The Ritual of %s started.°c0",daemonname[pd->ritualdaemon]); } else ritual_hurt(cn,pd,it[in].x,it[in].y); } // realnameplate if (drdata[0]==6) { // get pd pd=set_data(cn,DRD_LAB5_PLAYER,sizeof(struct lab5_player_data)); if (!pd) return; if (pd->ritualstate==0) { log_char(cn,LOG_SYSTEM,0,"Nothing happens."); return; } if (pd->ritualstate==1 && pd->ritualdaemon==drdata[1]) { sound_area(ch[cn].x,ch[cn].y,41); pd->ritualstate=2; log_char(cn,LOG_SYSTEM,0,"Thou canst read the symbols now. They form the words:"); log_char(cn,LOG_SYSTEM,0,"°c3The ritual of %s is the Ritual of %s.°c0",daemonname[pd->ritualdaemon],daemonreal[pd->ritualdaemon]); } else ritual_hurt(cn,pd,it[in].x,it[in].y); } // entrance if (drdata[0]==7) { static int hurttrans[4]={2,3,0,1}; // get pd pd=set_data(cn,DRD_LAB5_PLAYER,sizeof(struct lab5_player_data)); if (!pd) return; if (pd->ritualstate==0) return; if (pd->ritualstate==2 && pd->ritualdaemon==drdata[1]){ sound_area(ch[cn].x,ch[cn].y,41); pd->ritualdaemon=drdata[1]; pd->ritualstate=3; log_char(cn,LOG_SYSTEM,0,"Mathor tells you: \"The ritual continues. Well done so far, %s.\"",ch[cn].name); // log_char(cn,LOG_SYSTEM,0,"°c3The Ritual of %s continues.°c0",daemonname[pd->ritualdaemon]); } else { if (drdata[1]==2) log_char(cn,LOG_SYSTEM,0,"Mathor tells you: \"Sorry. But a strange power forced me.\""); ritual_hurt(cn,pd,namecoordx[hurttrans[(int)drdata[1]]],namecoordy[hurttrans[(int)drdata[1]]]); } } // backdoor if (drdata[0]==8) { // watch the syntax! if (!teleport_char_driver(cn,namecoordx[2],namecoordy[1])) if (!teleport_char_driver(cn,namecoordx[0],namecoordy[0])) if (!teleport_char_driver(cn,namecoordx[1],namecoordy[1])) if (!teleport_char_driver(cn,namecoordx[2],namecoordy[2])) teleport_char_driver(cn,namecoordx[3],namecoordy[3]); } // gun if (drdata[0]==9) { if (drdata[1]) { log_char(cn,LOG_SYSTEM,0,"Thou canst not push the lever."); return; } drdata[1]=7; it[in].sprite+=7; set_sector(it[in].x,it[in].y); call_item(it[in].driver,in,0,ticker+GUNRELOAD); create_fireball(cn,it[in].x+2,it[in].y,it[in].x+60,it[in].y,100); } // pike if (drdata[0]==10) { hurt(cn,5*POWERSCALE,0,1,0,0); if (drdata[1]) return; drdata[1]++; it[in].sprite++; set_sector(it[in].x,it[in].y); call_item(it[in].driver,in,0,ticker+5*TICKS); } // no potion door if (drdata[0]==11) { if (ch[cn].x<it[in].x && has_potion(cn) ) { log_char(cn,LOG_SYSTEM,0,"°c3Thou canst not enter carrying a mana, healing or combo potion!°c0"); return; } if (ch[cn].x<it[in].x) teleport_char_driver(cn,it[in].x-9,it[in].y-7); else teleport_char_driver(cn,it[in].x+9,it[in].y+7); } } }
int ritual_start(int cn, int daemon) { int i,x=0,y,sx,sy,ex,ey,break2,mn,doorx,doory,co; // x=0 to avoid compiler warning! static int statue1[4]={11165,11123,11157,11161}; static int statue2[4]={11167,11125,11159,11163}; // check for free room for (i=0; i<MAXDOOR; i++) { sx=daemondoorx[i]+0; sy=daemondoory[i]-6; ex=daemondoorx[i]+14; ey=daemondoory[i]+6; for (break2=0,y=sy; !break2 && y<=ey; y++) { for (x=sx; x<=ex; x++) { if ((co=map[x+y*MAXMAP].ch) && (ch[co].flags&CF_PLAYER)) { break2=1; break; } } } if (y==ey+1 && x==ex+1) break; } if (i==MAXDOOR) return 0; // cleanup for (y=sy; y<=ey; y++) { for (x=sx; x<=ex; x++) { mn=x+y*MAXMAP; if ((co=map[mn].ch) && !(ch[co].flags&CF_PLAYER)) remove_destroy_char(co); } } // create new room doorx=daemondoorx[i]; doory=daemondoory[i]; map[(doorx+2)+(doory-2)*MAXMAP].fsprite=statue1[daemon]; set_sector(doorx+2,doory-2); // set sector ? map[(doorx+2)+(doory+2)*MAXMAP].fsprite=statue1[daemon]; set_sector(doorx+2,doory+2); map[(doorx+12)+(doory-2)*MAXMAP].fsprite=statue2[daemon]; set_sector(doorx+12,doory-2); map[(doorx+12)+(doory+2)*MAXMAP].fsprite=statue2[daemon]; set_sector(doorx+12,doory+2); if (daemon==1) { ritual_create_char("lab5_one_servant",doorx+10,doory-2,DX_LEFT,7); ritual_create_char("lab5_one_servant",doorx+10,doory+2,DX_LEFT,7); ritual_create_char("lab5_one_master",doorx+12,doory+0,DX_LEFT,8); } else if (daemon==2) { ritual_create_char("lab5_two_servant",doorx+10,doory-2,DX_LEFT,7); ritual_create_char("lab5_two_servant",doorx+10,doory+2,DX_LEFT,7); ritual_create_char("lab5_two_master",doorx+12,doory+0,DX_LEFT,8); } else if (daemon==3) { ritual_create_char("lab5_three_servant_mage",doorx+6,doory-4,DX_DOWN,7); ritual_create_char("lab5_three_servant_mage",doorx+6,doory+4,DX_UP,7); ritual_create_char("lab5_three_servant",doorx+12,doory+1,DX_LEFT,8); ritual_create_char("lab5_three_master",doorx+12,doory-1,DX_LEFT,8); } // insert character if (teleport_char_driver(cn,doorx+1,doory)) return 1; return 0; }
void teufel_death(int cn,int cc) { struct teufel_pk_data *dat; int n; int kill_n=-1,dam=0,killer=-1; dat=set_data(cn,DRD_TEUFELPK,sizeof(struct teufel_pk_data)); if (!dat) return; // oops... for (n=0; n<MAXTEUFEL; n++) { if (dat->cc[n]) { xlog("killed by %s, damage %.2f",dat->name[n],dat->dam[n]/1000.0f); if (dat->dam[n]>dam) { dam=dat->dam[n]; kill_n=n; killer=dat->cc[n]; } } } if (kill_n==-1 || killer==-1) { elog("no one got the kill?"); } else { db_new_pvp(); for (n=0; n<MAXTEUFEL; n++) { if (dat->cc[n]) { if (n==kill_n) { db_add_pvp(dat->name[n],ch[cn].name,"kill",dat->dam[n]); secure_log(dat->cc[n],cn,"a kill"); } else if (dat->cc[n]==cc) { db_add_pvp(dat->name[n],ch[cn].name,"final",dat->dam[n]); secure_log(dat->cc[n],cn,"a final blow"); } else { db_add_pvp(dat->name[n],ch[cn].name,"assist",dat->dam[n]); secure_log(dat->cc[n],cn,"an assist"); } } } winner_gets_item(killer,cn); } del_data(cn,DRD_TEUFELPK); if (ch[cn].x>=120 && ch[cn].x<=254 && ch[cn].y>=139 && ch[cn].y<=228) { if (teleport_char_driver(cn,225,249)) ; else if (teleport_char_driver(cn,221,248)) ; else if (teleport_char_driver(cn,227,245)) ; else if (teleport_char_driver(cn,219,241)) ; else teleport_char_driver(cn,216,237); } else { // error fallback if (teleport_char_driver(cn,250,250)) ; else if (teleport_char_driver(cn,247,250)) ; else if (teleport_char_driver(cn,250,247)) ; else if (teleport_char_driver(cn,247,247)) ; else teleport_char_driver(cn,245,247); } ch[cn].hp=10*POWERSCALE; }